簡體   English   中英

C ++類訪問說明符詳細程度

[英]C++ Class Access Specifier Verbosity

“傳統的”C ++類(只是一些隨機聲明)可能類似於以下內容:

class Foo
{
public:
  Foo();
  explicit Foo(const std::string&);
  ~Foo();

  enum FooState
  {
    Idle, Busy, Unknown
  };

  FooState GetState() const;
  bool GetBar() const;
  void SetBaz(int);

private:
  struct FooPartialImpl;

  void HelperFunction1();
  void HelperFunction2();
  void HelperFunction3();

  FooPartialImpl* m_impl; // smart ptr
  FooState m_state;
  bool m_bar;
  int m_baz;
};

如果原始程序員沒有整齊地組織他的“訪問區域”,我總是發現這種類型的訪問級別規范很難並且難以遵循。


看一下Java / C#風格的相同代碼片段,我們得到:

class Foo
{
  public: Foo();
  public: explicit Foo(const std::string&);
  public: ~Foo();

  public: enum FooState
  {
    Idle, Busy, Unknown
  };

  public: FooState GetState() const;
  public: bool GetBar() const;
  public: void SetBaz(int);

  private: struct FooPartialImpl;

  private: void HelperFunction1();
  private: void HelperFunction2();
  private: void HelperFunction3();

  private: FooPartialImpl* m_impl; // smart ptr
  private: FooState m_state;
  private: bool m_bar;
  private: int m_baz;
};

在我看來,這更容易在標題中讀取,因為訪問說明符就在目標旁邊,而不是一堆線。 我在使用未與通常的“* .hpp / * .inl”對分開的僅標題模板代碼時發現這一點尤其正確。 在那種情況下,函數實現的大小壓倒了這個小而重要的信息。


我的問題很簡單,源於我從未見過其他人在他們的C ++代碼中主動執行此操作的事實。

假設我沒有“Class View”能力的IDE,那么使用這種級別的冗長有什么明顯的缺點嗎?

歡迎任何其他風格的建議!

“在羅馬做到入鄉隨俗。”

我花了很多時間使用Java,就像分別為每個字段和方法指定訪問說明符的樣式一樣。 但是,當我使用C ++編程時,我總是使用第一個代碼片段中顯示的樣式。

就個人而言,我發現必須為每個符號指定訪問限定符非常煩人。 它使事情變得更難閱讀,而不是更容易,並鼓勵在整個班級定義中自由混合私人和公共事物的壞習慣。 我總是看到這種混亂。 在C#中,我嘗試使用#region private等來緩解這種情況,這有望鼓勵未來的維護者保持清潔。

雖然你會引起人們的注意,但它沒有任何問題。 保持訪問說明符分離的主要優點是它鼓勵將所有私有成員和方法放在類的頂部 - 一起。

如果你的類太大而不適合放在一個screenfull上,那么它應該分解成多個類,和/或任何隱式內聯函數都應該內聯顯式聲明,並將實現移出類。

后一種方法的缺點是很少進行,並且以這種方式讓其他開發人員感到驚訝並不是一個好主意,並且它需要輸入訪問修飾符一百萬次。 使用傳統方法可以省去不必要地反復輸入修改器,也是預期的方法。

事實上,在語義上它沒有任何區別,但如果你只是按照接受的方式,你會做自己和你的同事。

我個人喜歡我的課程:

struct S {
    S(int m) : m(m) { }
    S(const S& o);
    S& operator=(const S& o);

    void f() const;
    std::string g();

private:
    void help();

private:
    int m;
};

但是如果我進入一個並非嚴格意義上的存儲庫,我會不加思索地改變我的舉止,因為我知道如果有人將我們的代碼提交到我的存儲庫之后,我會有多么感激。

暫無
暫無

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

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