Terlalu Banyak Parameter di Metode Java, Bagian 2: Objek Parameter

Di posting saya sebelumnya, saya melihat beberapa masalah yang terkait dengan daftar parameter panjang untuk metode dan konstruktor. Dalam posting itu, saya membahas mengganti tipe primitif dan built-in dengan tipe khusus untuk meningkatkan keterbacaan dan keamanan tipe. Pendekatan itu membuat banyak parameter ke metode atau konstruktor lebih mudah dibaca, tetapi tidak melakukan apa pun untuk mengurangi jumlah parameter. Dalam posting ini, saya melihat penggunaan Objek Parameter untuk mengurangi jumlah parameter ke metode atau konstruktor.

Biasanya bukan ide yang baik untuk membuat objek "junk drawer" yang memasangkan parameter tidak terkait yang satu-satunya hubungannya dengan parameter lain adalah bahwa mereka harus diteruskan ke metode atau konstruktor yang sama. Namun, ketika parameter terkait sedang diteruskan ke konstruktor atau metode sebagai bagian dari objek yang sangat kohesif , pemfaktoran ulang yang dikenal sebagai Memperkenalkan Objek Parameter adalah solusi yang bagus. Penggunaan pemfaktoran ulang ini dijelaskan sebagai "pengelompokan parameter yang secara alami berjalan bersama." Saya akan menunjukkan refactoring ini di posting ini.

Untuk mendemonstrasikan kegunaan refactoring Memperkenalkan Parameter Objek, pertama mari kita lihat contoh dari posting terakhir yang menggunakan banyak Stringdan booleanparameter dalam panggilan metode.

 /** * Instantiate a Person object. * * @param lastName * @param firstName * @param middleName * @param salutation * @param suffix * @param streetAddress * @param city * @param state * @param isFemale * @param isEmployed * @param isHomeOwner * @return */ public Person createPerson( final String lastName, final String firstName, final String middleName, final String salutation, final String suffix, final String streetAddress, final String city, final String state, final boolean isFemale, final boolean isEmployed, final boolean isHomeOwner) { // implementation goes here } 

Seperti yang saya bahas di posting sebelumnya, pendekatan ini membosankan bagi penelepon, membuatnya terlalu mudah untuk melewatkan parameter dalam urutan yang salah dengan sedikit keamanan tipe, dan dapat mengurangi keterbacaan kode. Untungnya, parameter dalam contoh ini memberikan beberapa peluang bagus untuk menerapkan pemfaktoran ulang Memperkenalkan Parameter Objek. Parameter "nama" (termasuk salam dan sufiks) dapat dimasukkan dalam satu kelas nama lengkap. Parameter alamat (alamat jalan, kota, dan negara bagian) bisa berada dalam satu objek alamat. Parameter lain mungkin tidak dengan mudah dikelompokkan ke dalam satu kelas dengan kohesi tinggi.

Dengan aplikasi yang disarankan dari pemfaktoran ulang Memperkenalkan Parameter Objek, panggilan metode yang ditampilkan sebelumnya lebih sederhana berkat pengurangan jumlah parameter. Ini ditunjukkan dalam daftar kode berikutnya.

 public Person createPerson( final FullName fullName, final Address address, final boolean isFemale, final boolean isEmployed, final boolean isHomeOwner) { return new Person(); } 

Contoh di atas sekarang hanya memiliki lima parameter dan lebih mudah dibaca serta lebih mudah digunakan oleh klien. Ini juga lebih aman dari perspektif pengetikan karena hampir tidak mungkin untuk membingungkan string nama dengan string alamat dalam kasus ini. Sayangnya, tiga parameter boolean tetap menjadi sumber kebingungan potensial dan sedikit keterbacaan cloud. Daftar kode berikutnya menunjukkan potensi implementasi kelas FullNamedan Address.

FullName.java (Sederhana)

package dustin.examples; /** * Full name of a person. * * @author Dustin */ public final class FullName { private final String lastName; private final String firstName; private final String middleName; private final String salutation; private final String suffix; public FullName( final String newLastName, final String newFirstName, final String newMiddleName, final String newSalutation, final String newSuffix) { this.lastName = newLastName; this.firstName = newFirstName; this.middleName = newMiddleName; this.salutation = newSalutation; this.suffix = newSuffix; } public String getLastName() { return this.lastName; } public String getFirstName() { return this.firstName; } public String getMiddleName() { return this.middleName; } public String getSalutation() { return this.salutation; } public String getSuffix() { return this.suffix; } @Override public String toString() { return this.salutation + " " + this.firstName + " " + this.middleName + this.lastName + ", " + this.suffix; } } 

Address.java (Sederhana)

package dustin.examples; /** * Representation of a United States address. * * @author Dustin */ public final class Address { private final String streetAddress; private final String city; private final String state; public Address(final String newStreetAddress, final String newCity, final String newState) { this.streetAddress = newStreetAddress; this.city = newCity; this.state = newState; } public String getStreetAddress() { return this.streetAddress; } public String getCity() { return this.city; } public String getState() { return this.state; } @Override public String toString() { return this.streetAddress + ", " + this.city + ", " + this.state; } } 

Meskipun kodenya ditingkatkan, masih ada beberapa masalah yang dapat diperbaiki. Secara khusus, metode asli dengan terlalu banyak parameter masih memiliki tiga booleanparameter yang dapat dengan mudah disalahartikan satu sama lain. Meskipun Stringparameter untuk metode tersebut difaktorkan menjadi dua kelas baru, kedua kelas baru tersebut masih masing-masing terdiri dari sekelompok Strings. Dalam kasus ini, seseorang mungkin ingin melengkapi refactoring Perkenalkan Objek Parameter dengan penggunaan tipe kustom. Menggunakan tipe khusus yang saya tunjukkan di posting terakhir saya, metode dengan terlalu banyak parameter sekarang terlihat seperti yang ditunjukkan pada daftar kode berikutnya.

 public Person createPerson( final FullName fullName, final Address address, final Gender gender, final EmploymentStatus employment, final HomeownerStatus homeownerStatus) { // implementation goes here } 

Metode ini sekarang memiliki lebih sedikit parameter dan parameter yang dimilikinya adalah semua jenis yang berbeda. IDE dan compiler Java sekarang dapat sangat membantu dalam memastikan bahwa klien menggunakan antarmuka ini dengan benar. Menerapkan jenis khusus (ditulis di posting terakhir) ke kelas FullNamedan Addressmenghasilkan dua daftar kode baru berikutnya untuk kelas tersebut.

FullName.java (Jenis Kustom)

package dustin.examples; /** * Full name of a person. * * @author Dustin */ public final class FullName { private final Name lastName; private final Name firstName; private final Name middleName; private final Salutation salutation; private final Suffix suffix; public FullName( final Name newLastName, final Name newFirstName, final Name newMiddleName, final Salutation newSalutation, final Suffix newSuffix) { this.lastName = newLastName; this.firstName = newFirstName; this.middleName = newMiddleName; this.salutation = newSalutation; this.suffix = newSuffix; } public Name getLastName() { return this.lastName; } public Name getFirstName() { return this.firstName; } public Name getMiddleName() { return this.middleName; } public Salutation getSalutation() { return this.salutation; } public Suffix getSuffix() { return this.suffix; } @Override public String toString() { return this.salutation + " " + this.firstName + " " + this.middleName + this.lastName + ", " + this.suffix; } } 

Address.java (Jenis Kustom)

package dustin.examples; /** * Representation of a United States address. * * @author Dustin */ public final class Address { private final StreetAddress streetAddress; private final City city; private final State state; public Address(final StreetAddress newStreetAddress, final City newCity, final State newState) { this.streetAddress = newStreetAddress; this.city = newCity; this.state = newState; } public StreetAddress getStreetAddress() { return this.streetAddress; } public City getCity() { return this.city; } public State getState() { return this.state; } @Override public String toString() { return this.streetAddress + ", " + this.city + ", " + this.state; } } 

Semua contoh saya sejauh ini adalah publickelas mandiri . Saya sering menemukan bahwa jika saya memerlukan objek parameter hanya untuk menyampaikan informasi antara metode dan konstruktor dalam paket yang sama yang dapat berguna untuk membuat packageruang lingkup kelas objek parameter ini . Kelas bersarang juga dapat digunakan untuk objek parameter ini dalam beberapa kasus.

Manfaat dan Keuntungan

Manfaat paling jelas dari objek parameter adalah pengurangan jumlah parameter yang diteruskan ke metode atau konstruktor. Enkapsulasi parameter terkait ini mempermudah untuk memastikan dengan cepat tipe apa yang sedang diteruskan ke metode atau konstruktor. Lebih mudah bagi pengembang untuk memahami sejumlah kecil parameter.

Objek parameter memiliki salah satu manfaat yang sama yang diberikan oleh jenis kustom: kemampuan untuk menambahkan perilaku dan karakteristik tambahan ke objek parameter untuk fungsi kenyamanan. Misalnya, memiliki Addresskelas daripada sekelompok Stringjenis memungkinkan seseorang untuk memvalidasi alamat.

Biaya dan Kerugian

Kelemahan utama dari objek parameter adalah pekerjaan ekstra untuk merancang, mengimplementasikan, dan menguji kelas. Namun, ini cukup mudah untuk ditulis dan diuji dan alat modern seperti IDE dan bahasa skrip membuatnya lebih mudah untuk mengotomatiskan bagian yang paling biasa dan membosankan dari tugas tersebut. Argumen yang lebih kecil lagi terhadap pendekatan ini adalah bahwa pendekatan ini dapat disalahgunakan. Jika pengembang mulai menggabungkan parameter yang tidak terkait menjadi satu kelas hanya untuk mengurangi jumlah parameter, itu tidak selalu membantu situasi. Pendekatan tersebut memang mengurangi jumlah parameter, tetapi tujuan akhir untuk meningkatkan keterbacaan tidak tercapai dan dapat dikatakan bahwa pendekatan ini bahkan kurang dapat dibaca.

Kesimpulan

Objek parameter menyediakan pendekatan bersih yang bagus untuk mengenkapsulasi parameter terkait dengan tepat untuk mengurangi jumlah parameter total ke metode atau konstruktor. Mereka mudah diimplementasikan dan secara signifikan dapat meningkatkan keterbacaan dan parameter keamanan tipe yang diteruskan ke panggilan metode dan konstruktor. Objek parameter dapat ditingkatkan lebih lanjut melalui penggunaan jenis kustom seperti yang dijelaskan di posting saya sebelumnya.

Pengeposan asli tersedia di //marxsoftware.blogspot.com/ (Terinspirasi oleh Acara Aktual)

Artikel ini, "Terlalu Banyak Parameter dalam Metode Java, Bagian 2: Objek Parameter" aslinya diterbitkan oleh JavaWorld.