簡體   English   中英

返回多個枚舉值的最佳方法是什么? (Java和C#)

[英]What's the best way to return multiple enum values? (java and C#)

刪除了更多原始內容,使問題更易於參考:

因此,我有一個House類,該類具有方法House.buy(Person p) ,導致該人購買房屋。 我想知道該人是否有可能購買房屋,因此我還有一個方法House.tryBuy(Player p) ,如果該人可以購買該房屋,則返回該方法。 我有一個枚舉BuyState ,其值如OKNotEnoughMoneyAlreadyOwned 需要滿足一些不同的條件,客戶想知道哪個失敗。 但是,如果多個條件失敗了怎么辦? 我可以有一個層次結構,例如如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM