簡體   English   中英

有一個沒有自己的 get 方法的 set 方法是不好的做法嗎?

[英]Is it bad practice to have a set method without its own get method?

假設我有一個 class (名稱圈是隨機的,沒有意義):

Class circle{
    double colorFrequency_;
public:
    void setColor(double colorFrequency){ colorFrequency_=colorFrequency; }
    void setColor(string colorName){ colorFrequency_=colorNameToFrequency(string colorName); } 
    double getColorFrequency()
    string getColorName(){ /* converts color frequency into a string containing the name of a color it's close to, like "red" */ }

}

一方面,有一個名為 setColor 的方法但沒有一個名為 getColor 的方法似乎不一致,但另一方面,如果我改為使用名為 setColorFrequency 和 setColorName 的函數,那么這些名稱將不完全具有描述性,因為 setColorName 不僅影響getColorName的output,也影響setColorFrequency的output。

有一個叫做 setColor 的 function 卻沒有一個叫做 getColor 是不是太奇怪了?

這取決於您是否希望 class 的用戶獲得會員值。

無論是否不同尋常,您都應該堅持您的設計要求。

您可能需要SetModel() function 但GetModel()沒有意義的一種眾所周知的設計是:Model-View-Presenter (MVP) Pattern 或其變體(例如 MVC、MVVM 等)

在過去的一年中,我主要從事 UI 方面的工作,在那里我按照 Prism 架構(WPF 和 Silverlight)實現了 MVP。 我們的設計是這樣的:

//C# code, but this design can written in C++ as well
public class QueryPresenter : IQueryPresenter, /*other interfaces */
{

   public QueryPresenter(IQueryView view, /*other parameter*/)
   {
     //...
     view.SetModel(this);
   }
}

That is, its the presenter which calls the SetModel function of the view to set itself as model for the view, but there is no GetModel function in view class because it doesn't make sense at all.

所以是的,這完全取決於您可能需要設置 function 的設計,但獲取 function 可能沒有意義。 通常這樣的集合函數用於“配置” object,它會以其他方式使用,例如在 MVP 模式中。 集合函數也可以用於很少有類以協作方式工作的設計中。 這樣的類可能是彼此的friend ,因此它們可以訪問彼此的private成員(如果需要)。

我不確定它有多奇怪,但人們可能會考慮將突變器重命名為changeColor (或類似的不同的東西),以更清楚地表明沒有 getter/setter “配對”。

就個人而言,我更願意讓轉換完全獨立於Circle並讓調用者處理它:

double colorNameToFrequency(const string& name) { ... }
string colorFrequencyToName(double frequency) { ... }

class Circle
{
    double colorFrequency_;
public:
    void setColor(double colorFrequency);
    double getColor() const;
};

// Client code 
Circle c;
c.setColor(colorNameToFrequency("mint-green"));
string name = colorFrequencyToName(c.getColor());

這使得Circle class 獨立於您選擇的任何 colors 的人類可讀格式。

暫無
暫無

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

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