[英]What's the best way to return multiple enum values? (java and C#)
删除了更多原始内容,使问题更易于参考:
因此,我有一个 House
类,该类具有方法House.buy(Person p)
,导致该人购买房屋。我想知道该人是否有可能购买房屋,因此我还有一个方法 House.tryBuy(Player p)
,如果该人可以购买该房屋,则返回该方法。我有一个枚举 BuyState
,其值如OK
, NotEnoughMoney
和AlreadyOwned
。需要满足一些不同的条件,客户想知道哪个失败。 但是,如果多个条件失败了怎么办? 我可以有一个层次结构,例如如果House已经拥有并且Person没有足够的钱,则返回 BuyStates.AlreadyOwned
。但这只能让我告诉客户一件事。
我可以有N个单独的条件,以及一个具有N * N值的枚举,例如ConditionA_AND_ConditionB_ANDConditionC
但这出于几个原因根本没有任何意义。 我知道有一些位域,每个条件都有一些位,但是它们似乎太底层了,难以实现且无法扩展。 所以我需要一种从枚举返回值列表的方法,那么像这样的类怎么样:
class C<type_of_enum> {
private List<type_of_enum> values;
//etc etc
}
这是“最佳”的设计吗?
(保留有关java和C#的问题以使答案有效)
在Java中,最自然的方法是使用EnumSet
。 构造一个例子:
return EnumSet.of(BuyConditions.NotEnoughMoney, BuyConditions.AlreadyOwned);
在C#中,我将进行标志枚举。
检查设计标志枚举 。
这是“最佳”的设计吗?
这似乎是一个奇怪的设计。 在用软件对现实世界进行建模时,它会付出分红,以使模型反映现实。 这样的模型更容易理解,维护和扩展。
首先,房子不是买人的东西。 一个人就是买房的东西。 “购买”方法应该在“人”上,而不是在“房屋”上。
第二,房屋不是决定是否可以购买房屋的东西。 房子的所有者是确定是否可以购买的实体。 (为什么会有“已拥有”错误条件?当然房屋已经拥有。 有人拥有它。)
第三,您可能必须考虑在多个买家可能试图一次全部购买房屋的世界中发生了什么。 实际上,卖方收集各种报价并提出还价,销售可能取决于其他事件,依此类推。 所有这些东西都应该存在于模型中吗? 如果是这样,在哪里? 由于所有者是与之协商的事物,因此可能处于表示所有者的对象的状态。
第四,实际上,购房交易通常涉及受信任的第三方进行托管,以及可能提供资金或持有留置权的各种其他各方,例如卖方和买方的贷方。 那些当事方反映在该模型中吗?
第五,如果您打算在模型中添加“为什么不能买这套房子的理由”,那么您所描述的是一个政策体系 。 在这种情况下,请将策略表示为系统中的一流对象,以便像其他任何对象一样对它们进行操作。 业主有关于在什么条件下出售的政策。 银行制定有关放贷条件的政策。 等等。
在此模型中,您的问题变成“如果购买者满足每个相关机构的政策树强加的所有必要条件才能购买给定房屋,请向政策解决引擎咨询”。 换句话说,问题“ X可以买Y吗?” X或Y都不知道; 制定政策解析引擎是一件很重要的事情,这就是让您返回X未能从Z购买Y的政策清单的原因。
说得通?
是的,这似乎是最好的设计。 您想返回一个原因列表(或集合),因此很自然地将其作为集合返回。
我认为返回不购买原因的清单很不错; 它很能表达您的意图。 设置一组可能会更合适,但稍微合适一点。
对我来说听起来不错。 您要返回失败条件的列表,并且要返回失败条件的列表。
您可以使用回调:
class House {
public void buy(Result result) {
if (true)
result.ok(this);
else
result.error(this, EnumSet.of(Status.NOT_ENOUGH_MONEY, Status.ALREADY_OWNED));
}
}
enum Status {
NOT_ENOUGH_MONEY,
ALREADY_OWNED
}
interface Result {
public void ok(House house);
public void error(House house, EnumSet<Status> status);
}
您可以将列表指针传递给该函数,而不用返回列表,以将其填充以防出现错误情况。 函数本身可以返回0表示成功,返回1表示失败,在这种情况下,您可以检查列表的内容。
假设大多数情况下将成功,这将使它更快地知道函数调用是否成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.