java中方法的命名_Java方法中的参数太多,第5部分:方法命名
java中方法的命名
在上一篇文章 (有關處理Java方法中過多參數的系列文章的 第4部分 )中,我將方法重載視為一種向客戶提供需要較少參數的版本的方法或構造函數的方法。 我描述了該方法的一些缺點,并建議從方法重載中擺脫出來以使用不同名稱的方法至少可以部分解決這些缺點。 在本文中,我將更深入地探討如何使用仔細的方法命名(包括構造方法)來刪除冗長的參數列表并避免方法重載的某些問題。
從減少方法和構造函數調用中所需的參數數量的角度來看,與方法重載相關的一些最重要的問題圍繞著對大量參數可以重載相同方法名多少次的限制,尤其是在某些情況下的參數共享相同的數據類型。 例如,如果我有一個具有三個String屬性的類,并且想編寫三個構造函數以分別僅接受這些屬性之一,那么我真的不能通過方法重載來做到這一點。 如果我嘗試過,則必須將接受單個String的構造函數用于這三個屬性之一,并且只有Javadoc注釋才能解釋單參數構造函數設置的三個屬性中的哪一個。 擺脫對所有方法和構造方法使用相同名稱的限制,可以使代碼在預期和假定參數方面更具表現力。
下面的代碼清單包含各種方法的一些示例,這些方法要求一個獨立的類(不是Person類)提供Person的實例(在我之前的文章中引用的有關太多Java參數的類)。 這些方法的名稱很長,描述了有關參數預期的內容。 這意味著在Javadoc注釋中需要描述的內容更少,方法的調用對客戶端更易讀,并且與方法重載相比,可以支持更多的可能性和參數排列。
命名方法的示例以描述其功能
public Person createPersonWithFirstAndLastNameOnly(final String firstName, final String lastName){// implementation goes here ...}public Person createEmployedHomeOwningFemale(final FullName name, final Address address){// implementation goes here ...}public Person createEmployedHomeOwningMale(final FullName name, final Address address){// implementation goes here ...}public Person createUnemployedHomeOwningFemale(final FullName name, final Address address){// implementation goes here ...}public Person createEmployedRentingMale(final FullName name, final Address address){// implementation goes here ...}上面代碼中顯示的較長的方法名稱具有描述性,可為客戶端提供一個良好的起點,讓他們知道要提供哪些參數。 當然,我可以編寫更多類似上述方法的方法來介紹參數的各種排列,但是我列出的小集合可以說明這一點。 注意,在這些代碼示例中,我還使用了參數對象 (在我的參數對象文章中定義的FullName和Address )來進一步減少參數的數量。
我上面的代碼示例演示了為實例方法提供不同的描述性名稱,以暗示要傳遞的參數,甚至在某些情況下還暗示不需要提供哪些參數,因為它們隱含在方法名稱中。 Java的新手可能會認為此方法不能與對象實例化/構造一起使用,因為Java類構造函數必須使用與該類相同的名稱來命名。 這意味著只能基于方法簽名重載構造函數。 幸運的是, Josh Bloch在Effective Java的兩個版本的第一篇中都談到了這一點。 正如Bloch在此處所述,我們可以采用靜態初始化工廠方法來提供類的實例。 Bloch在第1項中引用的好處之一是能夠按我們認為合適的方式命名這些方法。
下一個代碼清單演示了這些靜態初始化工廠的功能。 當我實現這些時,我喜歡實現僅由靜態初始化工廠調用的一個或很少數量的private構造函數(無法由外部類實例化)。 這使我可以將構造函數的方法簽名留給潛在的不足,因為只有我的類必須使用它,而其他人使用的靜態初始化工廠更易于使用,并且隱藏了許多參數構造函數的丑陋之處。 更具體地說,如果構造函數對可選參數采用null,則可以編寫各種靜態初始化工廠,以便我的客戶端不需要傳遞null,但是我的工廠方法可以將null傳遞給構造函數。 簡而言之,靜態初始化工廠方法使我能夠為客戶端提供更簡潔,更愉悅的界面,并在類的內部隱藏丑陋之處。 由于無法用解釋性細節給它們命名,因此我不能輕松地直接為它提供多個構造函數。 這些靜態初始化方法的另一個優點是,如果需要,我可以讓它們接受“原始”類型并將其內置到自定義類型和參數對象中。 所有這些情況在下一個代碼清單中顯示。
靜態初始化工廠展示
/*** Parameterized constructor can be private because only my internal builder* needs to call me to provide an instance to clients.* * @param newName Name of this person.* @param newAddress Address of this person.* @param newGender Gender of this person.* @param newEmployment Employment status of this person.* @param newHomeOwner Home ownership status of this person.*/private Person(final FullName newName, final Address newAddress,final Gender newGender, final EmploymentStatus newEmployment,final HomeownerStatus newHomeOwner){this.name = newName;this.address = newAddress;this.gender = newGender;this.employment = newEmployment;this.homeOwnerStatus = newHomeOwner;}public static Person createInstanceWithNameAndAddressOnly(final FullName newName, final Address newAddress){return new Person(newName, newAddress, null, null, null);}public static Person createEmployedHomeOwningFemale(final FullName newName, final Address newAddress){return new Person(newName, newAddress, Gender.FEMALE, EmploymentStatus.EMPLOYED, HomeownerStatus.HOME_OWNER);}public static Person createEmployedHomeowningMale(final FullName newName, final Address newAddress){return new Person(newName, newAddress, Gender.MALE, EmploymentStatus.EMPLOYED, HomeownerStatus.HOME_OWNER);}public static Person createUnemployedMaleRenter(final FullName newName, final Address newAddress){return new Person(newName, newAddress, Gender.MALE, EmploymentStatus.NOT_EMPLOYED, HomeownerStatus.RENTER);}public static Person createPersonWithFirstNameLastNameAndAddress(final Name newFirstName, final Name newLastName, final Address newAddress){return new Person(new FullName.FullNameBuilder(newLastName, newFirstName).createFullName(),newAddress, null, null, null);}public static Person createPersonWithFirstNameLastNameAndAddress(final String newFirstName, final String newLastName, final Address newAddress){return new Person(new FullName.FullNameBuilder(new Name(newLastName), new Name(newFirstName)).createFullName(),newAddress, null, null, null);}如以上示例所示,這些方法的客戶可以使用可讀性強的方法,而不必擔心提供大量參數。 前面的代碼清單中的最后兩個方法是將方法重載與靜態初始化工廠方法結合在一起的示例。
優勢與優勢
使用適當命名的方法(在這些方法的名稱中包含有關預期參數和隱含參數的信息)會帶來一些優于簡單方法/構造函數重載的優點。 由于可以根據每種方法的預期和假設自定義方法的名稱,因此調用代碼的意圖更加清晰。 如上面的示例所示,這些方法可能意味著不需要顯式提供哪些參數,因為它們被假定為該方法的一部分(并且意圖是通過方法的名稱而不是通過Javadoc進行通信的)。
在這里,我沒有明確地關注它,但是與簡單的方法重載相比,精心選擇的方法名稱的另一個優點是能夠在方法名稱中包含單元或其他上下文信息。 例如,我可以提供setWholeLengthInMeters(int)和setFractionalLengthInFeet(double)方法,而不是使用接受int和double setLength()方法。
成本與劣勢
使用不同命名的實例方法和靜態初始化工廠方法肯定比方法重載提供了一些優勢,但是不幸的是,從參數減少的角度來看,仍然具有方法重載的一些缺點。 不同名稱的方法與重載方法共享的一個缺點是可能必須編寫許多方法來支持可能使用的參數的各種組合和排列。 如果在以上示例中僅針對性別,房主身份和就業身份的每種組合編寫了一種方法,則將需要八個方法(第2到第3次冪)。 如果任何一個單獨的參數可以具有2種以上的可能性,則命名方法的不同組合的數量僅用于處理該增加的不同可能性。 當然,沒有有限可能性的參數不能為每個可能的值編寫方法,因此必須傳入而不是假定。
盡管描述性很強的方法名稱很容易閱讀,但是擁有很多潛在方法名稱的問題可能會降低總體可讀性,因為客戶端在調用類時必須經過一長串方法。 同樣,有些人可能不喜歡長的方法名稱以及在屏幕上占用大量空間。 我個人不介意長名,因為我認為它們提供的可讀性值得在屏幕上添加其他文本。 IDE和代碼完成功能意味著很少有人再輸入這些名稱,并且開發人員使用了很多監視器,這使得長方法名稱的問題不再那么麻煩。
結論
方法的名稱可用于向客戶傳達重要意義。 在我們努力澄清要傳遞給特定方法的參數(包括減少參數數量)的情況下,適當地命名方法可以隱含默認設置,從而無需提供參數,并且可以解釋參數的順序和其他特征。其他確實需要應用的參數。
翻譯自: https://www.javacodegeeks.com/2013/10/too-many-parameters-in-java-methods-part-5-method-naming.html
java中方法的命名
總結
以上是生活随笔為你收集整理的java中方法的命名_Java方法中的参数太多,第5部分:方法命名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9299 元,小米推出米家智能蒸烤一体集
- 下一篇: 零刻 100W 氮化镓 PD3.0 适配