Programavimas

Per daug parametrų „Java“ metoduose, 3 dalis: kūrėjo raštas

Dviejuose savo ankstesniuose įrašuose nagrinėjau, kaip reikia sumažinti konstruktorių ar metodų iškvietimui reikalingų parametrų skaičių naudojant pasirinktinius tipus ir parametrų objektus. Šiame įraše aš žvelgiu į kūrėjo modelio naudojimą, norėdamas sumažinti konstruktoriui reikalingų parametrų skaičių, aptartas, kaip šis modelis gali padėti net naudojant ne konstruktoriaus metodus, kuriems reikia per daug parametrų.

Antrajame „Efektyvios„ Java “leidime Joshas Blochas pateikia statybininkų modelį, esantį 2 punkte, naudodamasis konstruktoriais, kuriems reikalinga per daug parametrų. Blochas ne tik parodo, kaip naudotis „Builder“, bet ir paaiškina jo pranašumus, palyginti su konstruktoriais, priimančiais daug parametrų. Aš pasinaudosiu tais pranašumais šio įrašo pabaigoje, tačiau manau, kad svarbu pabrėžti, jog Blochas šiai praktikai paskyrė visą savo knygos elementą.

Norėdami iliustruoti šio požiūrio pranašumus, naudosiu šį pavyzdį Asmuo klasė. Joje nėra visų metodų, kuriuos paprastai pridedu prie tokios klasės, nes noriu sutelkti dėmesį į jos konstrukciją.

Person.java (be statybininko modelio)

pakuotė dustin.pavyzdžiai; / ** * Asmens klasė naudojama kaip per daug demonstruojamų parametrų dalis. * * @author Dustin * / viešosios klasės asmuo {private final String lastName; privati ​​finalinė eilutė firstName; privati ​​finalinė eilutė „middleName“; privati ​​finalinė styginių sveikinimas; privati ​​galutinė styginių priesaga; privati ​​finalinė „String streetAddress“; privatus finalinis styginių miestas; privati ​​galutinė styginė valstybė; privati ​​galutinė loginė reikšmė yra Moteris; privati ​​galutinė loginė reikšmė yraDirba; privati ​​galutinė loginė vertė yra „HomeWWner“; public Person (final String newLastName, final String newFirstName, final String newMiddleName, final String newSalutation, final String newSuffix, final String newStreetAddress, final String newCity, final String newState, final boolean newIsFemale, final Boolean newIsEwwends, final this boolean newIsOmeans, final this boolean. pavardė = naujaPavardė; this.firstName = newFirstName; this.middleName = newMiddleName; this.salutation = newSalutation; this.suffix = newSuffix; this.streetAddress = newStreetAddress; this.city = newCity; this.state = newState; this.isFemale = newIsFemale; this.isEmployed = newIsEmployed; this.isHomewOwner = newIsHomeOwner; }} 

Šios klasės konstruktorius veikia, tačiau kliento kodą sunku tinkamai naudoti. Kad būtų lengviau naudoti konstruktorių, galima naudoti „Builder“ modelį. „NetBeans“ man tai pertvarkys, kaip rašiau anksčiau. Toliau pateikiamas pertvarkyto kodo pavyzdys („NetBeans“ tai daro sukurdamas visą naują „Builder“ klasę).

PersonBuilder.java

pakuotė dustin.pavyzdžiai; public class PersonBuilder {private String newLastName; privati ​​eilutė newFirstName; privati ​​eilutė newMiddleName; privati ​​eilutė newSalutation; privati ​​eilutė newSuffix; privati ​​eilutė newStreetAddress; privati ​​„String newCity“; privati ​​„String newState“; privatus boolean newIsFemale; privatus boolean newIsDarbas; privatus loginis „newIsHomeOwner“; public PersonBuilder () {} public PersonBuilder setNewLastName (String newLastName) {this.newLastName = newLastName; grąžinti tai; } public PersonBuilder setNewFirstName (String newFirstName) {this.newFirstName = newFirstName; grąžinti tai; } public PersonBuilder setNewMiddleName (String newMiddleName) {this.newMiddleName = newMiddleName; grąžink tai; } public PersonBuilder setNewSalutation (String newSalutation) {this.newSalutation = newSalutation; grąžinti tai; } public PersonBuilder setNewSuffix (String newSuffix) {this.newSuffix = newSuffix; grąžink tai; } public PersonBuilder setNewStreetAddress (String newStreetAddress) {this.newStreetAddress = newStreetAddress; grąžinti tai; } public PersonBuilder setNewCity (String newCity) {this.newCity = newCity; grąžinti tai; } public PersonBuilder setNewState (String newState) {this.newState = newState; grąžink tai; } public PersonBuilder setNewIsFemale (loginė naujaIsFemale) {this.newIsFemale = newIsFemale; grąžinti tai; } public PersonBuilder setNewIsEmployed (boolean newIsEmployed) {this.newIsEmployed = newIsEmployed; grąžinti tai; } public PersonBuilder setNewIsHomeOwner (loginis newIsHomeOwner) {this.newIsHomeOwner = newIsHomeOwner; grąžink tai; } viešasis asmuo createPerson () {grąžinti naują asmenį (naujasPavadinimas, naujasPavadinimas, naujasMiddleName, newSalutation, newSuffix, newStreetAddress, newCity, newState, newIsFemale, newIsEmployed, newIsHomeOwner); }} 

Aš norėčiau, kad mano „Builder“ būtų įdėta klasė, kurios objektą jis sukuria, tačiau „NetBeans“ automatinės atskiros kūrėjo kartos naudojimas yra labai paprastas. Kitas skirtumas tarp „NetBeans“ sukurto „Builder“ ir „Builders“, kuriuos mėgstu rašyti, yra tai, kad mano pageidaujamiems „Builder“ diegimams reikalingi laukai, kuriuos reikia pateikti „Builder“ konstruktoriuje, o ne pateikti argumentą „be argumentų“. Kitas kodų sąrašas rodo mano Asmuo klasė iš viršaus su statybininku, įtraukta į ją kaip įdėtą klasę.

Asmuo. Java su įdėtu asmeniu. Statybininkas

pakuotė dustin.pavyzdžiai; / ** * Asmens klasė naudojama kaip per daug parametrų demonstravimo dalis. * * @author Dustin * / viešosios klasės asmuo {private final String lastName; privati ​​finalinė eilutė firstName; privati ​​finalinė eilutė „middleName“; privati ​​finalinė styginių sveikinimas; privati ​​galinė styginių priesaga; privati ​​finalinė „String streetAddress“; privatus finalinis styginių miestas; privati ​​galutinė styginė valstybė; privati ​​galutinė loginė reikšmė yra Moteris; privati ​​galutinė loginė reikšmė yraDirba; privati ​​galutinė loginė vertė yra „HomeWWner“; public Person (final String newLastName, final String newFirstName, final String newMiddleName, final String newSalutation, final String newSuffix, final String newStreetAddress, final String newCity, final String newState, final boolean newIsFemale, final Boolean newIsEmwends, final this boolean newIsOmeans, final this boolean. pavardė = naujaPavardė; this.firstName = newFirstName; this.middleName = newMiddleName; this.salutation = newSalutation; this.suffix = newSuffix; this.streetAddress = newStreetAddress; this.city = newCity; this.state = newState; this.isFemale = newIsFemale; this.isEmployed = newIsEmployed; this.isHomewOwner = newIsHomeOwner; } public static class PersonBuilder {private String nestedLastName; privati ​​eilutė „nestedFirstName“; privati ​​eilutė „nestedMiddleName“; privati ​​eilutė „nestedSalutation“; privati ​​eilutė „nestedSuffix“; privati ​​eilutė „nestedStreetAddress“; privati ​​eilutė „nestedCity“; privati ​​eilutė „nestedState“; privatus loginis elementas įdėtasIsFemale; privatus loginis „nestedIs“ dirba; privatus loginis įterptasIsHomeOwner; public PersonBuilder (final String newFirstName, final String newCity, final String newState) {this.nestedFirstName = newFirstName; this.nestedCity = newCity; this.nestedState = newState; } public PersonBuilder lastName (String newLastName) {this.nestedLastName = newLastName; grąžinti tai; } public PersonBuilder firstName (String newFirstName) {this.nestedFirstName = newFirstName; grąžinti tai; } public PersonBuilder middleName (String newMiddleName) {this.nestedMiddleName = newMiddleName; grąžinti tai; } public PersonBuilder pasveikinimas (String newSalutation) {this.nestedSalutation = newSalutation; grąžink tai; } public PersonBuilder priesaga (String newSuffix) {this.nestedSuffix = newSuffix; grąžinti tai; } public PersonBuilder streetAddress (String newStreetAddress) {this.nestedStreetAddress = newStreetAddress; grąžinti tai; } public PersonBuilder city (String newCity) {this.nestedCity = newCity; grąžink tai; } public PersonBuilder state (String newState) {this.nestedState = newState; grąžinti tai; } public PersonBuilder isFemale (boolean newIsFemale) {this.nestedIsFemale = newIsFemale; grąžinti tai; } public PersonBuilder isElployed (loginiai naujiejiIsEmployed) {this.nestedIsEmployed = newIsEmployed; grąžinti tai; } public PersonBuilder isHomeOwner (loginis naujasIsHomeOwner) {this.nestedIsHomeOwner = newIsHomeOwner; grąžinti tai; } public asmuo createPerson () {grąžinti naują asmenį (nestedLastName, nestedFirstName, nestedMiddleName, nestedSalutation, nestedSuffix, nestedStreetAddress, nestedCity, nestedState, nestedIsFemale, nestedIsEmployed, nestedIsHomeOwner); }}} 

„Builder“ gali būti dar geresnis, kai patobulintas naudojant pasirinktinius tipų ir parametrų objektus, kaip aprašyta pirmuose dviejuose mano pranešimuose apie „per daug parametrų“ problemą. Tai rodoma kitame kodų sąraše.

Person.java su įdėtu kūrėju, pasirinktinių tipų ir parametrų objektu

pakuotė dustin.pavyzdžiai; / ** * Asmens klasė naudojama kaip per daug demonstruojamų parametrų dalis. * * @author Dustin * / viešosios klasės asmuo {privatus galutinis vardas, pavardė; asmeninis galutinis adreso adresas; privati ​​galutinė lyčių lytis; privatus galutinis „EmploymentStatus“ užimtumas; privatus galutinis „HomeownerStatus homeOwnerStatus“; / ** * Parametruotas konstruktorius gali būti privatus, nes tik mano vidinis statybininkas * turi man paskambinti, kad klientams pateiktų egzempliorių. * * @param newName Šio asmens vardas. * @param newAddress Šio asmens adresas. * @param newGender Šio asmens lytis. * @param newEmployment Šio asmens užimtumo statusas. * @param newHomeOwner Šio asmens namų nuosavybės statusas. * / privatus asmuo (galutinis „FullName newName“, galutinis adresas „newAddress“, galutinis „Lytis newGender“, galutinis „EmploymentStatus newEmployment“, galutinis „HomeownerStatus“ newHomeOwner) {this.name = newName; this.address = newAddress; this.gender = newGender; tai.darbas = naujasUžimtumas; this.homeOwnerStatus = newHomeOwner; } public FullName getName () {grąžinti šį.pavadinimą; } public Address getAddress () {return this.address; } public Gender getGender () {return this.gender; } public EmploymentStatus getEmployment () {return this.employment; } public HomeownerStatus getHomeOwnerStatus () {return this.homeOwnerStatus; } / ** * Statybininkų klasė, kaip aprašyta Joshua Blocho antrame leidime * Veiksminga „Java“ kuris naudojamas kuriant {@link Person} egzempliorių. * / public static class PersonBuilder {private Pilnas Vardas nestedName; privatus adresas nestedAddress; privati ​​Lytis įdėta Lytis; privatus „EmploymentStatus“ įdėtas į „EmploymentStatus“; privataus namo savininko statusas lizdasHomeOwnerStatus; public PersonBuilder (galutinis Pavadinimas newFullName, galutinis adresas newAddress) {this.nestedName = newFullName; this.nestedAddress = newAddress; } public PersonBuilder vardas (galutinis Pavadinimas newName) {this.nestedName = newName; grąžinti tai; } public PersonBuilder address (final Address newAddress) {this.nestedAddress = newAddress; grąžink tai; } public PersonBuilder gender (final Lytis newGender) {this.nestedGender = newGender; grąžinti tai; } public PersonBuilder Užimtumas (galutinis EmploymentStatus newEmploymentStatus) {this.nestedEmploymentStatus = newEmploymentStatus; grąžink tai; } public PersonBuilder homeOwner (final homeownerStatus newHomeOwnerStatus) {this.nestedHomeOwnerStatus = newHomeOwnerStatus; grąžink tai; } public Person createPerson () {grąžinti naują asmenį (nestedName, nestedAddress, nestedGender, nestedEmploymentStatus, nestedHomeOwnerStatus); }}} 

Paskutinės poros kodų sąrašų parodo, kaip paprastai naudojamas „Builder“ - objektui kurti. Iš tiesų, elementas ant statybininko (elementas Nr. 2) Joshua Blocho antrame „Efektyvios Java“ leidime yra skyriuje apie objekto sukūrimą (ir sunaikinimą). Tačiau statybininkas gali netiesiogiai padėti taikydamas nekonstruktoriaus metodus, leisdamas lengviau sukurti metodams perduotus parametrų objektus.