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