Saya pemrograman di Java, dan saya selalu membuat konverter seperti ini:
public OtherObject MyObject2OtherObject(MyObject mo){
... Do the conversion
return otherObject;
}
Di tempat kerja baru polanya adalah:
public void MyObject2OtherObject(MyObject mo, OtherObject oo){
... Do the conversion
}
Bagi saya itu sedikit bau, karena saya terbiasa tidak mengubah parameter yang masuk. Apakah perubahan parameter yang masuk ini merupakan antipattern atau apakah itu OK? Apakah ada beberapa kelemahan serius?
java
clean-code
anti-patterns
CsBalazsHungary
sumber
sumber
oo
adalah objek yang diteruskan ke metode, bukan penunjuk yang diatur ke objek baru. Apakah itu yang terjadi di sini? Jika ini adalah Jawa mungkin, jika C ++ mungkin tidakJawaban:
Ini bukan antipengganti, ini praktik yang buruk.
Perbedaan antara antipattern dan hanya praktik buruk ada di sini: definisi anti-pola .
Gaya tempat kerja baru yang Anda perlihatkan adalah praktik yang buruk , peninggalan zaman atau pra-OOP, menurut Kode Bersih Paman Bob.
sumber
OtherObject
antarmuka? Hanya penelepon (mudah-mudahan) yang tahu jenis konkret yang diinginkannya.Mengutip buku terkenal Robert C. Martin "Clean Code":
Pola kedua melanggar kedua aturan, terutama "argumen keluaran". Dalam hal ini lebih buruk daripada pola pertama.
sumber
Idiom kedua bisa lebih cepat, karena pemanggil dapat menggunakan kembali satu variabel melalui loop panjang, alih-alih setiap iterasi membuat instance baru.
Saya biasanya tidak akan menggunakannya, tetapi misalnya. dalam pemrograman game itu ada tempatnya. Sebagai contoh, lihat banyak operasi JavaMonkey's Vector3f memungkinkan untuk lulus contoh yang harus diubah dan dikembalikan sebagai hasilnya.
sumber
Saya tidak berpikir itu adalah dua bagian kode yang setara. Dalam kasus pertama, Anda harus membuat
otherObject
. Anda dapat mengubah instance yang ada di yang kedua. Keduanya memiliki kegunaannya. Kode bau akan lebih suka satu sama lain.sumber
Itu benar-benar tergantung pada bahasa.
Di Jawa bentuk kedua mungkin anti-pola, tetapi beberapa bahasa memperlakukan parameter lewat secara berbeda. Di Ada dan VHDL misalnya, bukannya lulus dengan nilai atau dengan referensi, parameter dapat memiliki mode
in
,out
atauin out
.Ini adalah kesalahan untuk mengubah suatu
in
parameter atau membaca suatuout
parameter, tetapi setiap perubahan pada suatuin out
parameter diteruskan kembali ke pemanggil.Jadi dua bentuk di Ada (ini juga VHDL legal)
dan
Keduanya memiliki kegunaannya; suatu prosedur dapat mengembalikan beberapa nilai dalam banyak
Out
parameter sementara suatu fungsi hanya dapat mengembalikan satu hasil. Karena tujuan dari parameter kedua secara jelas dinyatakan dalam prosedur deklarasi tidak ada keberatan untuk formulir ini. Saya cenderung lebih suka fungsi agar mudah dibaca. tetapi akan ada kasus di mana prosedur lebih baik, misalnya di mana pemanggil telah membuat objek.sumber
Memang terlihat bau, dan tanpa melihat lebih banyak konteks tidak mungkin untuk mengatakan dengan pasti. Mungkin ada dua alasan untuk melakukan ini, meskipun ada alternatif untuk keduanya.
Pertama, ini adalah cara ringkas untuk mengimplementasikan konversi sebagian, atau membiarkan hasilnya dengan nilai default jika konversi gagal. Yaitu, Anda mungkin memiliki ini:
Tentu saja, biasanya ini ditangani dengan menggunakan pengecualian. Namun, bahkan jika pengecualian perlu dihindari karena alasan apa pun, ada cara yang lebih baik untuk melakukan ini - pola TryParse menjadi satu opsi.
Alasan lain adalah bahwa itu bisa karena alasan konsistensi murni, misalnya itu adalah bagian dari API publik di mana metode ini digunakan untuk semua fungsi konversi untuk alasan apa pun (seperti fungsi konversi lainnya yang memiliki banyak keluaran).
Java tidak hebat dalam menangani beberapa keluaran - ia tidak bisa memiliki parameter keluaran saja seperti beberapa bahasa, atau memiliki beberapa nilai pengembalian seperti yang lain - tetapi meskipun demikian, Anda masih bisa menggunakan objek pengembalian.
Alasan konsistensi agak timpang tetapi sayangnya itu mungkin yang paling umum.
sumber
Keuntungan dari pola kedua adalah memaksa penelepon untuk mengambil kepemilikan dan tanggung jawab untuk objek yang dibuat. Tidak ada pertanyaan apakah metode tersebut membuat objek atau mendapatkannya dari kumpulan yang dapat digunakan kembali. Penelepon tahu bahwa mereka bertanggung jawab atas masa pakai dan pembuangan objek baru.
Kerugian dari metode ini adalah:
OtherObject
kebutuhan dan membangunnya terlebih dahulu.MyObject
.OtherObject
harus dapat dibangun tanpa mengetahuiMyObject
.Jawabannya didasarkan pada pengalaman saya di c #, saya harap logikanya diterjemahkan ke Jawa.
sumber
Dengan semantik yang longgar -
myObjectToOtherObject
bisa juga berarti Anda memindahkan beberapa data dari objek pertama ke objek kedua atau Anda mengonversinya sepenuhnya baru, metode kedua tampaknya lebih memadai.Namun, jika nama metode itu
Convert
(yang seharusnya jika kita melihat bagian "... lakukan konversi"), saya akan mengatakan metode kedua tidak masuk akal. Anda tidak mengonversi nilai menjadi nilai lain yang sudah ada, IMO.sumber