命名对象实体对象_我的对象命名
命名對象實體對象
這是最常見的辯論之一。 大多數人對此主題有自己的見解,卻沒人能真正說出哪個是正確的。 我當然不能,但是盡管如此,我還是決定與大家分享我的想法,投入兩美分,也許對某人會有幫助。
當我創建一個新類時,我要做的第一件事就是設計其接口(如您所知,我相信任何對象都必須實現至少一個接口)。 接口的名稱通常反映對象是什么,而不是對象的作用或其他對象應使用的對象。 在極少數情況下,我認為形容詞是合適的,其中之一是Iterable 。
湯姆和杰里–杰里的表哥,威廉·漢娜(William Hanna)和約瑟夫·巴貝拉(Joseph Barbera)
然后是該接口的實現。 由于將來可能會有更多實現,因此我主要根據封裝的細節來命名對象。 因此,假設接口是HttpRequest ,那么如果遵循該接口的第一個對象使用ApacheHttpClient,則其名稱可能是ApacheRequest 。 然后,可能會有另一個實現,與另一個http客戶端(可能是jcabi-http)一起工作 ,在這種情況下,名稱將為JcabiRequest 。
到目前為止,還算不錯,也許沒有什么新鮮的,但是這里有個要注意的地方:根據模式的不同,我自己的類的名稱不一定一定有意義。 例如,在我的一個項目中的某處,您將看到以下類:
/*** Decorator which adds some HTTP headers on the decorated request.*/ public final class HttpHeaders implements HttpRequest {//... }它本身看起來并不自然,對吧? 好吧,應該很清楚,這種類型的請求永遠都不應該“單獨”使用。 它的構造函數甚至不允許它,因為它應該包裝另一個HttpRequest ,或者另一個包裝器,或者一個具體的請求。 你能想到一個更好的名字嗎? 我相信,在命名一個類時,我們還必須考慮如何使用它,在何種上下文或模式下使用-如果將所有這些名稱放在一起時這些名稱有意義,那么您就可以了。 添加無用的名詞只會導致噪音。
HttpHeaders的用法如下:
Map<String, String> headers = ...;HttpRequest request = new HttpHeaders (new Get(URI.create(...)),headers);此外,我討厭無用的后綴。 讓我們以最光榮的例子為例:“工廠”。 您是否注意到,當一個對象負責創建其他對象時,不再重要了嗎? 上下文,業務,領域,什么都沒有! 該不良對象的名稱必須帶有后綴“ Factory”,否則代碼將無法工作。
我的代碼中確實有工廠對象,但是“ factory”一詞在任何地方都沒有。 該項目是一個聊天機器人,最頂級的抽象之一是“知識”,機器人知道該怎么做。 知識的每種實現都會創建代表它的步驟樹–機器人需要執行一個或多個步驟才能執行任何命令。 我所謂的“知識”實際上是一個工廠對象,因為它會創建其他對象(這些步驟)。 匯編代碼如下所示:
final Conversation talk = new Conversation(new Hello(new RunScript(new Confused())));talk.start(command);Conversation , Hello , RunScript和Confused都實現了Knowledge并且它們以級聯機制一起工作,以便找到要執行的正確步驟。 上面的代碼片段翻譯為以下單詞:“對話開始,機器人可以說'你好',為您運行一些腳本,如果它不理解命令,可能會感到困惑”。
現在,這里是相同的代碼片段,但具有更常見的命名:
final StepsFactory factory = new ConversationFactory(new HelloFactory(new RunScriptFactory(new ConfusedFactory())));factory.getSteps(command);哪一個更好? 它們都將以相同的方式工作,這僅與可讀性有關。 對我而言,這就像是完成的建筑物還是周圍仍然有建筑腳手架的建筑物–沒有人想知道房屋的建造方式,所使用的所有腳手架和儀器,這并不重要。 取而代之的是,每個人都渴望看到最終的構造,并且他們應該了解它的作用,而不要弄清楚實現它的目的。
另一個命名示例:
Log log = new WebLog(new LogFile("/comdor/ActionLogs", this.id),"https://webapps.amihaiemil.com" );為什么選擇WebLog ? 因為封裝的日志最終將在Web UI上呈現給用戶。 調用log.address() ,字符串“ https://webapps.amihaiemil.com”將與文件名連接在一起以形成有效的URL。 這是WebLog類,您還可以看到Log類型的封裝變量(將顯示給用戶)被命名為“ onServer”,因為它是最終從中獲取的日志文件。服務器。
這幾乎就是我如何處理命名的想法。 而且,當然,我總是寫JavaDocs(如果沒有它們,Maven Central甚至不允許您發布任何內容),因此,如果名稱不夠好,它上面的JavaDoc總是會為您提供幫助。 你怎么看? 您使用什么命名約定?
翻譯自: https://www.javacodegeeks.com/2018/01/take-object-naming.html
命名對象實體對象
總結
以上是生活随笔為你收集整理的命名对象实体对象_我的对象命名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用实例工厂方法实例化_一些工厂实例
- 下一篇: 谷歌宣布将建设海底光缆 Nuvem,创建