簡體   English   中英

OOP,強制方法調用順序

[英]OOP, enforcing method call order

題:

這是有關OOP實踐的問題。 我在使用API​​時遇到了一種情況,其中需要按特定的順序調用一系列方法。

案件:

控制智能傳感器的操作。

交互的簡化版本是這樣的:首先必須將API配置為通過TCP與傳感器連接,然后下一條命令開始掃描過程,然后接收多個項目的輸入,直到給出停止命令為止。 那時必須給出一系列類似的斷開命令。 如果這些命令無序執行,則會引發異常。

我在這里看到了模塊化和封裝概念之間的沖突。 每個步驟都是離散操作,因此應封裝在單獨的方法中,但它們也取決於正確的執行順序。

我是從后來開發此代碼的開發人員的角度考慮的。 似乎有些人必須對此系統有較高的了解,然后才能使用此代碼,這會使它感到脆弱。 我可以添加有關此呼叫順序的警告注釋,但我希望有一些適合我情況的原理或設計模式。

這是一個例子:

class RemoteTool
{
    public void Config();
    public void StartProcess();
    public void BeginListen();

    public void StopProcess();
    public void StopListening();
}

class Program
{
    static void Main(string[] args)
    {
        RemoteTool MyRemoteTool = new RemoteTool();

        MyRemoteTool.Config();
        MyRemoteTool.StartProcess();
        MyRemoteTool.BeginListen();

        // Do some stuff

        MyRemoteTool.StopListening();
        MyRemoteTool.StopProcess();
    }
}

我能想到的最接近的方法是使用布爾標志並在每個函數中檢入它們,以確保先決條件函數已被調用,但我想我希望有一種更好的方法。

這是我在尋找答案時發現的一種方法。 這很簡單,有幫助,但不能解決我的問題。

從本質上講,該類是完全在問題中創建的,但是從屬函數是按受保護的方式創建的,並且創建了一個公共成員以使其保持順序,如下所示:

class RemoteTool
{
    public bool Running = false;
    public void Run()
    {
        Config();
        StartProcess();
        BeginListen();

        Running = true;
    }

    public void Stop() {
        StopListening();
        StopProcess();

        Running = false;
    }

    protected void Config();
    protected void StartProcess();
    protected void BeginListen();

    protected void StopProcess();
    protected void StopListening();
}

問題在於您仍然必須以正確的順序調用Stop()和Run(),但是它們更易於管理並且模塊化程度更高。

我認為問題與RemoteTool類具有需要某些前提條件的合同有關。 例如:方法b()必須在方法a()之后執行()。

如果您的語言沒有提供定義此類前提條件的機制,則您需要自己實現。

我同意您的觀點,即在RemoteTool()類中實現此額外功能(或這些特定的類合同功能)可能會降低當前的設計水平。 一個簡單的解決方案是使用另一個類,該類負責在調用RemoteClass的特定方法之前強制執行所需的前提條件。(RemoteToolProxy()可以是一個合適的名稱)

這樣,您將使具體功能與說明如何使用它的契約脫鈎。

軟件設計方法還提供了其他替代方法,稱為按合同設計 ,可以為您提供改善類合同的其他方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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