我将构建的软件将涉及“应用程序”在不同状态之间切换很多。某些任务可以完成,具体取决于应用程序所处的状态。我在考虑使用枚举作为状态
public class Application
{
public int Id {get;set;}
public Status {get;set;}
}
public enum Status
{
[Description("New")]New = 1, [Description("Closed")]Closed = 2
}
但后来我想也许在数据库中使用查找表是好的,因为状态会经常更新/重新排序
table status (id int pk, desc string, sort_order int)
table application (id int pk, status_id int fk)
在我的情况下,我需要做像
这样的事情if (application.Status == Status.New)
{ //do something }
else if (application.Status == Status.Closed)
{ //do other things }
我认为以上情况更易于使用枚举。但是,当涉及到更新状态排序顺序或描述时,这将非常困难。
我应该使用反射根据查找表中的值动态创建枚举吗?或者我应该使用状态模式?我看到enum relfection的问题是性能影响。并且状态模式可以产生大量冗余代码。
你怎么看?提前谢谢!答案 0 :(得分:7)
你不应该在任何地方用这个支票撒上你的代码
if (application.Status == Status.New)
{ //do something }
else if (application.Status == Status.Closed)
{ //do other things }
相反,请使用状态模式。每当应用程序模式发生更改时更改状态,并将所有调用转发到状态方法。您将拥有更清晰,更易于维护的代码。
至于改变状态,这与状态模式无关。所以你可以使用任何优雅的方法。
答案 1 :(得分:3)
我创建一个包含差异的Status类,然后调用它们。所以(在Python中):
class StatusZero(object):
def call_me(self, app):
print 'Hello, from ' + app.name
return db.prepare_specific_status_zero_request()
class StatusOne(object):
def call_me(self, app):
print 'Hi, from ' + app.name
return db.prepare_specific_status_one_request()
states = { 'status_zero' : StatusZero(), 'status_one' : StatusOne() }
class Application(object):
name = 'My App'
status = states['status_zero']
def change_state(self, state):
status = state
def call_me(self):
state_key = self.status.call_me(self)
self.change_state(states[state_key])
快速,易于保持功能划分,并且在状态之间具有合理的继承模式,您可以共享不同的功能。
答案 2 :(得分:0)
我的理解是状态模式对于UI或仅在内存中的执行非常有用,在我从应用程序表中检索数据的情况下,仍然需要if else语句来确定要转换的对象。 / p>
public AbstractApplication convert_db_application_to_object(obj db_application)
{
AbstractApplication app;
if (db_application.Status == (int)Status.New)
app = application_factory.create(application_state_new);
else if(db_application.Status == (int)Status.Closed)
app = application_factory.create(application_state_closed);
return app;
}
我不认为这是一个优雅的解决方案 因为我仍然需要枚举或查找表来将应用程序状态保存到数据库中