![](/img/trans.png)
[英]Large scale usage of Meyer's advice to prefer Non-member,non-friend functions?
[英]C++ IDE that supports Scott Meyer's advice: Prefer non-member non-friend functions over members
Scott Meyer關於非成員函數增加封裝並允許更優雅的設計(designwise)的論點對我來說似乎非常有效。 見這里: 文章
但我對此有疑問。 (而且看似其他人,特別是圖書館開發人員,他們通常完全忽視這一點)
當我使用成員函數時,代碼通常看起來更好,更合乎邏輯。 這可能是一種后天的味道,只是需要一些人習慣首先查看算法,然后再查看對象。 (不寒而栗)
所以也許我只有一個問題:
使用成員函數, 我 和我的IDE知道類可以做什么。
對我來說這是巨大的! 我沒有使用任何不支持成員函數代碼完成的編程。 在設計良好的庫中,它完全取代了我的文檔。 即使我要查看api文檔,查看成員列表只是感覺絕對自然,合乎邏輯,我可以肯定,這就是結束。 如果方法不在那里,我可以放心地認為它不存在,我可以寫我的非會員非朋友。
我在STL中忍受了這一點,因為,除了基本組件之外,看到算法是有意義的,因為你已經習慣了它 。
我還沒有看到一個可以告訴我非成員函數在特定類上工作的IDE。
這實際上是我的問題:是否有一個IDE(或IDE功能)有助於此代碼約定?
我過去曾遇到過這件事。
然后我的想法相當笨拙,但完成了工作:命名空間。
我做的是
namespace myclass
{
class MyClass
{
...
};
MyClass operator+(const MyClass& lhs, const MyClass& rhs){...}
}
Meyers肯定是正確的,使用非成員通過最小化可能訪問私有狀態的函數的數量來增加封裝。 但是,封裝只是代碼質量的許多(通常是沖突的)方面之一。
他確實提出了一個有效的觀點,即圖書館作家不一定會為每個可能的類使用編寫函數(因為可能存在他們沒有想到的用法)。 這意味着您可能必須自己添加非成員“幫助”功能,就像他們遵循邁耶斯的建議一樣。 因此,無法知道成員和朋友函數集確實是作用於該類的唯一函數集。
作為技術專家,我喜歡的“IDE”(文本編輯器和shell)具有以下“功能”,這對於查找作用於類的函數非常有用:
find . -name '*.h' -o -name '*.cpp' | xargs grep MyClass
我不能評論“真正的”IDE。
我不相信IDE可以告訴您可以在課堂上使用的所有非成員函數。 使用模板,制作所有此類功能的列表實在太困難了。 IMO,你可以期待的最好的是IDE能夠在編譯之前告訴你你正在嘗試進行的呼叫是否有效。 甚至這需要在IDE內部進行一些嚴格的類似編譯的過程。
我理解你如何使用成員函數來替代經典類中的文檔。 但Scott Meyer所說的設計不是關於提供復雜功能的類,而是基本功能。 復雜的功能來自其他地方,原始類可能會或可能不會知道它,它並不重要。 這都是這個想法的一部分。 但你是對的。 在這種情況下,需要經過深思熟慮的文檔。
嘗試使用Visual AssistX,它有這個很好的功能:右鍵單擊你的類,Refactor(VA X) - >查找引用。 它確實有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.