Bagaimana saya bisa mempromosikan penggunaan pola Builder di tim saya?

22

Basis kode kami sudah lama dan programmer baru, seperti saya, cepat belajar melakukannya dengan cara yang dilakukan demi keseragaman. Berpikir bahwa kita harus mulai dari suatu tempat, saya mengambilnya sendiri untuk mereformasi kelas pemegang data sebagai berikut:

  • Metode setter yang dihapus dan membuat semua bidang final(saya ambil " finalbaik" secara aksiomatis). Setter hanya digunakan dalam konstruktor, ternyata, jadi ini tidak memiliki efek samping.
  • Memperkenalkan kelas Builder

Kelas Builder diperlukan karena konstruktor (yang pertama kali diminta refactoring) mencakup sekitar 3 baris kode. Ini memiliki banyak parameter.

Seperti keberuntungan, rekan satu tim saya sedang mengerjakan modul lain dan kebetulan membutuhkan setter, karena nilai-nilai yang diperlukannya tersedia di berbagai titik dalam aliran. Jadi kodenya tampak seperti ini:

public void foo(Bar bar){
    //do stuff
    bar.setA(stuff);
    //do more stuff
    bar.setB(moreStuff);
}

Saya berpendapat bahwa ia harus menggunakan pembangun sebagai gantinya, karena menyingkirkan setter memungkinkan bidang tetap tidak berubah (mereka telah mendengar saya mengomel tentang ketidakberubahan sebelumnya), dan juga karena pembangun memungkinkan pembuatan objek menjadi transaksional. Saya membuat sketsa pseudocode berikut:

public void foo(Bar bar){
    try{
        bar.setA(a);
        //enter exception-throwing stuff
        bar.setB(b);
    }catch(){}
}

Jika pengecualian itu kebakaran, barakan memiliki data korup, yang seharusnya dihindari dengan pembangun:

public Bar foo(){
        Builder builder=new Builder();
    try{
        builder.setA(a);
        //dangerous stuff;
        builder.setB(b);
        //more dangerous stuff
        builder.setC(c);
        return builder.build();
    }catch(){}
    return null;
}

Rekan satu tim saya menjawab bahwa pengecualian yang dimaksud tidak akan pernah menyala, yang cukup adil untuk area kode tertentu, tetapi saya yakin tidak ada hutan untuk pohon itu.

Kompromi adalah untuk kembali ke solusi lama, yaitu menggunakan konstruktor tanpa parameter dan mengatur semuanya dengan setter yang diperlukan. Alasannya adalah bahwa solusi ini mengikuti prinsip KISS, yang dilanggar oleh tambang.

Saya baru di perusahaan ini (kurang dari 6 bulan) dan sepenuhnya menyadari bahwa saya kehilangan yang ini. Pertanyaan yang saya miliki adalah:

  • Apakah ada argumen lain untuk menggunakan Builder alih-alih "cara lama"?
  • Apakah perubahan yang saya usulkan bahkan benar-benar layak?

tapi sungguh,

  • Apakah Anda punya tips untuk menyajikan argumen seperti itu dengan lebih baik ketika menganjurkan mencoba sesuatu yang baru?
sumpah
sumber
6
Builder akan perlu menetapkan nilai entah bagaimana. Jadi itu tidak menyelesaikan masalah dasar.
Amy Blankenship
3
Apa alasan barang (lebih / berbahaya / pengecualian) tidak dapat dipindahkan sebelum panggilan setA?
yatima2975
2
Hanya 3 baris parameter konstruktor? Itu tidak terlalu buruk.
pjc50
7
Dalam setiap desain perangkat lunak, selalu ada kompromi antara kompleksitas dan decoupling. Meskipun saya pikir saya setuju dengan Anda secara pribadi bahwa builder adalah solusi yang baik di sini, rekan kerja Anda merasa ragu karena KISS. Saya memelihara perangkat lunak yang sangat luar biasa rumit, dan sebagian alasannya adalah karena setiap karyawan baru menjadi nakal dan mengatakan "Ini bodoh, saya akan melakukan hal baru ini dengan cara saya", maka kami memiliki 5 kerangka kerja untuk penjadwalan pekerjaan latar belakang dan 8 metode untuk query database. Semua baik dalam jumlah sedang dan tidak ada jawaban benar yang jelas dalam kasus seperti ini.
Brandon
3
KISS adalah konsep fuzzy, objek yang dapat dimodifikasi adalah sumber kompleksitas yang sangat diremehkan oleh pengembang, mereka membuat multi-threading, debug, dan penanganan yang jauh lebih sulit daripada yang tidak dapat diubah. Apakah objek tersebut valid atau pengecualian dibuat pada konstruksi (tempat yang lebih baik untuk menangkap pengecualian itu?).
Alessandro Teruzzi

Jawaban:

46

Berpikir bahwa kita harus mulai dari suatu tempat, saya mengambilnya sendiri untuk mereformasi kelas pemegang data

Di sinilah terjadi kesalahan - Anda membuat perubahan arsitektur utama pada basis kode sedemikian rupa sehingga menjadi sangat berbeda dengan yang diharapkan. Anda mengejutkan kolega Anda. Kejutan hanya baik jika itu melibatkan pesta, prinsip kejutan paling tidak adalah emas (bahkan jika itu melibatkan pesta, maka aku akan tahu memakai celana dalam yang bersih!)

Sekarang jika Anda menganggap perubahan ini bermanfaat, akan jauh lebih baik untuk membuat sketsa kode semu yang menunjukkan perubahan dan menyampaikannya kepada kolega Anda (atau setidaknya siapa pun yang memiliki peran paling dekat dengan arsitek) dan lihat apa yang mereka pikirkan sebelum melakukan sesuatu. Karena, Anda menjadi nakal, berpikir seluruh basis kode adalah milik Anda untuk bermain sesuai keinginan Anda. Seorang pemain di tim, bukan pemain tim!

Saya mungkin sedikit kasar pada Anda, tetapi saya berada di tempat yang berlawanan: lihat beberapa kode dan pikirkan "WTF terjadi di sini ?!", hanya untuk menemukan pria baru (hampir selalu pria baru) memutuskan untuk berubah banyak hal berdasarkan apa yang menurutnya seharusnya "jalan yang benar". Sekrup dengan sejarah SCM juga yang merupakan masalah besar lainnya.

gbjbaanb
sumber
7
"Kejutan hanya baik jika melibatkan pesta," itu sebenarnya tidak benar untuk semua orang !! Saya akan berhenti berbicara dengan teman yang disebut apa saja yang mengejutkan saya , khususnya pesta . Dengan orang-orang . Ugh.
Darkhogg
3
Jadi jika setiap pola refactoring dan desain, atau setiap keputusan seperti "Apakah saya menggunakan accessor dan mutator di sini atau pola builder?" harus disetujui oleh tim, bagaimana pengembang akan merasa diberdayakan untuk melakukan hal yang benar? Bagaimana Anda akan membuat perubahan yang berpikiran maju jika semuanya harus dirancang oleh sebuah komite. Saya telah berada di posisi OP sebelum di mana saya terjebak harus mempertahankan kode tidak masuk akal (sebagai orang baru) yang orang lain takut untuk berubah karena konsisten . Konsistensi baik dan semuanya, tetapi tidak dengan mengorbankan perbaikan.
Brandon
11
@Brandon tidak, tapi setiap perubahan besar yang akan memengaruhi mereka seharusnya. Jika Anda harus memperbaiki bug, itu hanya sedikit kode - bukan masalah besar. Jika Anda membuat keputusan yang memengaruhi orang lain, maka setidak-tidaknya sopan untuk memberi tahu mereka apa yang Anda lakukan. Anda bisa mendapatkan persetujuan dari tim untuk mengubah kode tidak masuk akal Anda, dan kemudian perubahan Anda menjadi konsistensi baru. Anda hanya perlu berbicara dengan kolega Anda. Tidak ada yang buruk tentang mengatakan "Aku akan mengubah pola pengakses buruk yang kita semua benci" dan mendengar kolega Anda menjawab dengan "ya, sudah saatnya seseorang berurusan dengan itu"
gbjbaanb
13
@Brandon ada pepatah: "Jalan menuju neraka ditaburi dengan niat baik". Konsistensi bukan hanya baik , itu perlu ! Bayangkan mencoba mengelola tim pengembang yang secara kolektif mengelola 20 aplikasi, yang masing-masing ditulis dalam gaya dan / atau arsitektur yang berbeda karena preferensi, teknologi saat ini, tren, dll. Menentukan apa yang terbaik pada saat itu. Membuat tim untuk menyetujui bahwa sesuatu harus berubah dapat menjadi perbedaan antara orang baru yang diterima karena mereka memperbaiki masalah lama, dan dipecat karena menjadi lebih berani dengan apa yang Anda pikir terbaik.
DrewJordan
3
@Brandon - Jika Anda ingin bertindak jahat dan memperbaiki sesuatu "yang disetujui semua orang adalah salah" maka Anda mungkin akan lebih sukses dengan memilih sesuatu yang "semua orang setuju salah" daripada memilih sesuatu yang paling baik memiliki kubu yang berbeda di topik; seperti kekekalan. Desain / arsitektur yang baik membuat biaya tetap tinggi karena praktis tanpa imbalan. Jadi kecuali tim Anda mengalami masalah karena mereka menggunakan seter maka Anda tidak memperbaiki masalah sama sekali. OTOH, jika ini telah menjadi sumber bug sering maka sepertinya konsekuensi membenarkan keputusan tim.
Dunk
21

Seperti keberuntungan, rekan satu tim saya sedang mengerjakan modul lain dan kebetulan membutuhkan setter, karena nilai-nilai yang diperlukannya tersedia di berbagai titik dalam aliran.

Seperti dijelaskan, saya tidak melihat apa yang membuat kode membutuhkan seter. Saya mungkin tidak cukup tahu tentang use-case, tetapi mengapa tidak menunggu sampai semua parameter diketahui sebelum instantiate objek?

Sebagai alternatif, jika situasinya membutuhkan setter: tawarkan cara untuk membekukan kode Anda sehingga seter melempar kesalahan pernyataan (alias kesalahan programmer) jika Anda mencoba mengubah bidang setelah objek siap.

Saya pikir menghapus setter dan menggunakan final adalah cara yang "tepat" untuk melakukannya, serta menegakkan keabadian, tetapi apakah itu benar-benar apa yang harus Anda habiskan bersama?

Kiat umum

Lama = buruk, baru = baik, caraku, caramu ... diskusi semacam ini tidak konstruktif.

Saat ini, cara objek Anda digunakan mengikuti beberapa aturan implisit. Ini adalah bagian dari spesifikasi kode Anda yang tidak tertulis dan tim Anda mungkin berpikir bahwa tidak ada banyak risiko untuk bagian lain dari kode yang menyalahgunakannya. Apa yang ingin Anda lakukan di sini adalah membuat aturan lebih eksplisit dengan Builder dan waktu kompilasi cek.

Dalam beberapa hal, kode refactoring dikaitkan dengan teori Jendela Rusak : Anda merasa benar untuk memperbaiki masalah apa pun seperti yang Anda lihat (atau membuat catatan untuk beberapa pertemuan "peningkatan kualitas" nanti) sehingga kode selalu terlihat menyenangkan untuk dikerjakan, aman dan bersih. Anda dan tim Anda tidak memiliki gagasan yang sama tentang apa yang "cukup baik". Apa yang Anda lihat sebagai peluang untuk berkontribusi dan menjadikan kode lebih baik, dengan itikad baik, mungkin terlihat berbeda dari tim yang ada.

Ngomong-ngomong, tim Anda tidak boleh dianggap menderita inersia, kebiasaan buruk, kurang pendidikan, ... yang terburuk yang bisa Anda lakukan adalah memproyeksikan gambar orang yang tahu segalanya yang ada di sana untuk menunjukkan kepada mereka cara membuat kode. Misalnya, ketidakmampuan bukanlah sesuatu yang baru , rekan-rekan Anda mungkin sudah membaca tentang hal itu tetapi hanya karena topik ini menjadi populer di blog tidak cukup untuk meyakinkan mereka untuk menghabiskan waktu mengubah kode mereka.

Bagaimanapun, ada banyak cara untuk meningkatkan basis kode yang ada, tetapi membutuhkan waktu dan uang. Saya bisa melihat kode Anda, menyebutnya "lama" dan menemukan hal-hal yang perlu diperhatikan. Sebagai contoh: ada spesifikasi formal, tidak cukup menegaskan, mungkin tidak cukup komentar atau tes, tidak cukup cakupan kode, algoritma tidak optimal, terlalu banyak penggunaan memori, tidak menggunakan pola desain "terbaik" mungkin dalam setiap kasus, dll memuakkan . Tetapi untuk sebagian besar poin yang akan saya bahas, Anda akan berpikir: tidak apa-apa, kode saya berfungsi, tidak perlu menghabiskan lebih banyak waktu untuk itu.

Mungkin tim Anda berpikir bahwa apa yang Anda sarankan sudah melewati titik pengembalian yang semakin berkurang. Bahkan jika Anda telah menemukan yang sebenarnya contoh dari bug karena jenis contoh Anda menunjukkan (dengan pengecualian) mereka mungkin hanya akan memperbaikinya sekali dan tidak ingin refactor kode.

Jadi pertanyaannya adalah bagaimana menghabiskan waktu dan energi Anda, mengingat mereka terbatas ? Ada perubahan terus-menerus yang dilakukan untuk perangkat lunak, tetapi umumnya ide Anda mulai dengan skor negatif sampai Anda dapat memberikan argumen yang bagus untuk itu. Sekalipun Anda benar mengenai manfaatnya, itu sendiri bukanlah argumen yang cukup, karena ia akan berakhir di keranjang " Bagus untuk dimiliki, suatu hari ... ".

Ketika Anda mengajukan argumen, Anda harus melakukan beberapa pemeriksaan "kewarasan": apakah Anda mencoba menjual ide itu atau diri Anda sendiri? Bagaimana jika ada orang lain yang memberikan ini kepada tim? Apakah Anda menemukan beberapa kekurangan dalam alasan mereka? Apakah Anda mencoba menerapkan beberapa praktik terbaik umum atau apakah Anda mempertimbangkan secara spesifik kode Anda?

Kemudian, Anda harus memastikan tidak muncul sebagai-jika Anda mencoba untuk memperbaiki "kesalahan" masa lalu tim Anda. Ini membantu untuk menunjukkan bahwa Anda bukan ide Anda tetapi dapat menerima umpan balik secara wajar. Semakin banyak Anda melakukan ini, semakin banyak saran Anda akan memiliki kesempatan untuk diikuti.

coredump
sumber
Anda memang benar. Keberatan kecil: Ini bukan "cara lama" vs "cara baru saya, super luar biasa". Saya sepenuhnya sadar bahwa saya mungkin berbicara omong kosong. Masalah saya adalah bahwa dengan terus menggunakan praktik perangkat lunak yang setiap orang di perusahaan menemukan hal yang mengerikan, saya mungkin mandek sebagai pengembang. Jadi saya mencoba untuk memperkenalkan beberapa perubahan, bahkan jika saya salah. (Tugas dipicu oleh permintaan untuk refactor kelas terkait)
rath
@rath Apakah tidak ada basis kode baru yang dikembangkan?
biziclop
@ biziclop Ada beberapa modul baru yang dicolokkan ke basis kode lama. Saya mengerjakan satu baru-baru ini. Hari hari menyenangkan.
rath
5
@ kemarahan Mungkin Anda membutuhkan proyek pribadi yang dapat Anda kerjakan di waktu Anda sendiri di mana Anda dapat memajukan pengembangan Anda sendiri? Saya tidak yakin dengan argumen pola "Builder" Anda juga; getter / setters tampaknya merupakan solusi yang sangat oke berdasarkan informasi yang Anda berikan. Ingatlah bahwa Anda bertanggung jawab kepada atasan Anda dan tim Anda; prioritas Anda adalah memastikan bahwa pekerjaan apa pun yang Anda lakukan bermanfaat bagi mereka yang bertanggung jawab.
Ben Cottrell
@ marah Yah, bahkan jika Anda tidak berada dalam kode "lama / baru", yang penting adalah bagaimana hal itu dirasakan oleh pihak penerima, terutama jika mereka memiliki kekuatan keputusan lebih dari Anda. Sepertinya-jika Anda ingin memperkenalkan perubahan untuk minat Anda sendiri dan bukan untuk produk yang Anda kembangkan. Jika semua orang di perusahaan tersebut menganggap praktik itu mengerikan, pada akhirnya akan berubah, tetapi ini sepertinya bukan prioritas.
coredump
17

Bagaimana saya bisa mempromosikan penggunaan pola Builder di tim saya?

Kamu tidak.

Jika konstruktor Anda memiliki 3 baris parameter, itu terlalu besar dan terlalu rumit. Tidak ada pola desain yang akan memperbaikinya.

Jika Anda memiliki kelas yang datanya tersedia pada waktu yang berbeda, itu haruslah dua objek yang berbeda, atau konsumen Anda harus mengumpulkan komponen dan kemudian membangun objek. Mereka tidak perlu pembangun untuk melakukan itu.

Telastyn
sumber
Ini adalah pemegang data besar Stringdan primitif lainnya. Tidak ada logika di mana pun, bahkan tidak memeriksa nulls dll. Jadi itu hanya ukuran semata, bukan kompleksitas per se. Saya pikir melakukan sesuatu seperti builder.addA(a).addB(b); /*...*/ return builder.addC(c).build();itu akan jauh lebih mudah di mata.
rath
8
@rath: Ini pemegang data besar dari Strings dan primitif lainnya. => maka Anda memiliki masalah lain, harap tidak ada yang peduli jika bidang email kebetulan ditugaskan dengan alamat pos orang itu ...
Matthieu M.
@ MatthieuM. Satu masalah pada suatu waktu saya kira :)
rath
@rath - Sepertinya menggabungkan skema pengecekan validasi yang baik akan jauh lebih bermanfaat dan lebih mudah diterima daripada mencoba mencari cara untuk merombak pola builder ke dalam kode yang sudah ada. Di tempat lain Anda mengatakan ingin memperbaiki diri. Mempelajari cara mendapatkan keuntungan maksimum dengan sedikit upaya dan konsekuensi jelas merupakan atribut yang harus dikembangkan.
Dunk
1
Saya punya soooooo banyak konstruktor dengan parameter lebih dari itu. Diperlukan dalam pola IoC. Generalisasi buruk dalam jawaban ini.
djechlin
16

Anda tampaknya lebih fokus untuk menjadi benar daripada bekerja dengan baik dengan orang lain. Lebih buruk lagi, Anda menyadari bahwa apa yang Anda lakukan adalah perebutan kekuasaan namun gagal memikirkan bagaimana perasaan orang-orang yang pengalaman dan wewenangnya Anda tantang.

Balikkan itu.

Fokus pada bekerja dengan orang lain. Kerangka pemikiran Anda sebagai saran dan ide. Dapatkan mereka untuk berbicara melalui ide-ide mereka sebelum mengajukan pertanyaan untuk membuat mereka berpikir tentang Anda. Hindari konfrontasi langsung, dan secara lahiriah mau menerima bahwa melanjutkan melakukan hal-hal dengan cara kelompok (untuk saat ini) lebih produktif daripada berjuang dalam perjuangan berat untuk mengubah kelompok. (Meskipun membawa hal-hal kembali.) Jadikan bekerja dengan Anda sukacita.

Lakukan ini secara konsisten dan Anda harus mengurangi konflik, dan temukan lebih banyak ide Anda diadopsi oleh orang lain. Kita semua menderita ilusi bahwa argumen logis yang sempurna akan membuat orang lain kagum dan menang. Dan jika tidak bekerja seperti itu, kami pikir itu harus .

Tapi itu bertentangan langsung dengan kenyataan. Sebagian besar argumen hilang sebelum titik logis pertama dibuat. Bahkan di antara orang-orang yang konon logis, psikologi mengalahkan akal. Meyakinkan orang adalah tentang melewati rintangan psikologis untuk didengarkan dengan benar, dan bukan tentang memiliki logika yang sempurna.

btilly
sumber
2
Frame your thoughts as suggestions and ideas. Get THEM to talk through THEIR ideas before asking questions to make them think about yoursNamun +1 untuk itu
rath
2
@rath Ingatlah bahwa orang lain mungkin tidak membaca dari buku Anda. Mungkin saja orang yang Anda diskusikan dengan menganggapnya sebagai konfrontasi, yang dapat menjadi kontra-produktif untuk tujuan Anda.
Iker
2
@ kemarahan: Tidak ada yang benar atau salah. Hanya trade off. Dan lebih sering daripada tidak, pengorbanan melibatkan lebih dari kode saja.
Marjan Venema
1
@Dunk Semua yang ada adalah pertukaran. Kami menyebutnya benar atau salah ketika pertukarannya jelas dan jelas di satu sisi. Namun mengenali kapan nuansa menjadi ambigu lebih mudah jika kita fokus pada mereka sebagai trade-off dari awal.
btilly
2
Tidak ada pemrograman tunggal "praktik terbaik" yang saya sadari yang tidak memiliki pengecualian di mana itu bukan yang terbaik. Terkadang sulit untuk menemukan pengecualian itu, tetapi mereka selalu ada.
btilly
11

Apakah ada argumen lain untuk menggunakan Builder alih-alih "cara lama"?

"Ketika kamu memiliki palu baru, semuanya akan terlihat seperti paku." - ini adalah apa yang saya pikirkan ketika saya membaca pertanyaan Anda.

Jika saya adalah rekan Anda, saya akan bertanya kepada Anda "mengapa tidak menginisialisasi seluruh objek di konstruktor?" Bagaimanapun juga itulah fungsionalitasnya. Mengapa menggunakan pola builder (atau desain lainnya)?

Apakah perubahan yang saya usulkan bahkan benar-benar layak?

Sulit untuk mengetahui dari cuplikan kode kecil itu. Mungkin itu - Anda dan kolega Anda perlu mengevaluasinya.

Apakah Anda punya tips untuk menyajikan argumen seperti itu dengan lebih baik ketika menganjurkan mencoba sesuatu yang baru?

Ya, pelajari lebih lanjut tentang topik tersebut sebelum membahasnya. Persenjatai diri Anda dengan argumen dan alasan yang baik sebelum memasuki diskusi.

BЈовић
sumber
7

Saya berada dalam situasi di mana saya direkrut untuk keterampilan saya. Ketika saya melihat kode, well .. itu lebih mengerikan. Ketika kemudian mencoba untuk membersihkannya, seseorang yang sudah ada di sana lagi selalu menekan perubahan, karena mereka tidak melihat manfaatnya. Kedengarannya seperti sesuatu yang Anda gambarkan. Itu berakhir dengan saya berhenti dari posisi itu dan sekarang saya dapat berkembang jauh lebih baik di perusahaan yang memiliki praktik yang lebih baik.

Saya tidak berpikir Anda hanya harus berperan bersama dengan yang lain dalam tim karena mereka sudah ada di sana lebih lama. Jika Anda melihat anggota tim Anda menggunakan praktik buruk dalam proyek tempat Anda bekerja, itu adalah tanggung jawab Anda untuk menunjukkannya, seperti yang Anda miliki. Jika tidak, maka Anda bukan sumber yang sangat berharga. Jika Anda menunjukkan semuanya berulang kali, namun tidak ada yang mendengarkan, minta manajemen Anda untuk mengganti atau mengganti pekerjaan. Sangat penting bagi Anda untuk tidak membiarkan diri Anda beradaptasi dengan praktik buruk yang ada.

Untuk pertanyaan aktual

Mengapa menggunakan benda yang tidak bisa diubah? Karena Anda tahu apa yang Anda hadapi.

Katakanlah Anda memiliki koneksi db yang diteruskan yang memungkinkan Anda untuk mengubah host melalui setter, maka Anda tidak tahu koneksi apa itu. Menjadi abadi, maka Anda tahu.

Namun katakanlah bahwa Anda memiliki struktur data yang dapat diambil dari ketekunan dan kemudian kembali dengan data baru, maka masuk akal bahwa struktur ini tidak dapat diubah. Entitas yang sama, tetapi nilainya dapat berubah. Alih-alih menggunakan objek nilai yang tidak berubah sebagai argumen.

Apa yang menjadi fokus pertanyaan adalah pola pembangun untuk menghilangkan dependensi dalam konstruktor. Saya katakan TIDAK besar untuk ini. Contoh sudah jelas untuk kompleks. Jangan coba sembunyikan, perbaiki!

Tl; dr

Menghapus setter bisa benar, tergantung pada kelas. Pola pembangun tidak menyelesaikan masalah, hanya menyembunyikannya. (Kotoran di bawah karpet masih ada bahkan jika Anda tidak bisa melihatnya)

Super hero
sumber
Saya tidak tahu detail situasi Anda, tetapi jika Anda datang dan mencoba mengubah segalanya tanpa terlebih dahulu mendapatkan kepercayaan orang dengan keterampilan Anda atau tidak meluangkan waktu untuk belajar "mengapa" mereka melakukan hal-hal seperti yang mereka lakukan maka Anda diperlakukan dengan tepat karena Anda akan diperlakukan di hampir semua perusahaan, bahkan yang benar-benar bagus. Sebenarnya, terutama pada yang benar-benar bagus. Setelah orang percaya pada keterampilan seseorang maka itu hanya masalah membuat alasan yang menarik untuk saran Anda. Jika Anda tidak dapat membuat kasus yang menarik maka ada kemungkinan besar saran Anda tidak terlalu bagus.
Dunk
1
idk apa yang harus dibalas dengan asumsi Anda @Dunk Saya tidak mencoba mengubah segalanya, saya mencoba untuk membersihkannya. Dan bukan orang-orang yang tahu apa yang mereka lakukan, mereka dengan bangga menciptakan kelas dan fungsi di mana ratusan baris kode, dengan idk berapa banyak negara bagian, global, dan sebagainya .. levelnya lebih dekat dengan imo taman yang lebih baik. Jadi saya mendukung pernyataan saya. Jangan pernah mundur ketika Anda melihat diri Anda berada dalam posisi di mana Anda harus mengadopsi praktik buruk untuk menyesuaikan diri.
superhero
@Dunk Cobalah mengubah kode orang sebagai anggota tim bukan yang saya lakukan. Tetapi saya memberi tahu mereka sejak awal; "Saya tidak akan bekerja dalam proyek ini tanpa sepenuhnya menulis ulang itu" , jika kodenya adalah bagian dari sampah. Jika itu tidak sesuai, yah ... maka itu saling menguntungkan. Ini bukan hanya tentang kenyamanan, ini tentang fakta bahwa saya harus dapat bertanggung jawab atas apa yang saya hasilkan. Saya tidak bisa melakukan itu jika kode di sekitarnya dalam proyek berantakan total.
superhero
Anda tidak harus "selamanya" bekerja dengan kode yang sampah atau mengikuti praktik buruk hanya karena itulah yang dilakukan. Namun, jika Anda ingin berhasil mengubah hal-hal maka Anda harus membuktikan kredibilitas Anda terlebih dahulu sebagai minimum. Hampir setiap pengembang menganggap kode yang mereka warisi adalah sampah. Jika setiap perusahaan hanya setuju dengan pria baru setiap kali tanpa mengetahui tingkat keahlian mereka yang sebenarnya maka sampah akan berubah menjadi tempat pembuangan sampah. Juga, Anda harus meluangkan waktu untuk memahami mengapa hal-hal dilakukan sebagaimana adanya. Terkadang cara "salah" adalah cara "benar" untuk situasi tertentu.
Dunk
@Dunk Saya melihat bahwa Anda memiliki pendapat yang berbeda maka saya dalam hal ini. Anda tampaknya lebih populer, jika membaca dari jawaban yang lain. Saya tidak setuju, mengapa saya menulis jawaban ini sebagai oposisi. Apa yang Anda katakan tidak mengubah pikiran saya.
superhero
2

Sementara semua jawaban lainnya sangat berguna (akan lebih berguna daripada yang akan saya dapatkan), ada properti pembangun yang belum Anda sebutkan: dengan mengubah pembuatan objek menjadi suatu proses, Anda dapat menerapkan batasan logis yang kompleks.

Anda dapat memberi mandat misalnya bahwa bidang-bidang tertentu diatur bersama, atau dalam urutan tertentu. Anda bahkan dapat mengembalikan implementasi objek target yang berbeda tergantung pada keputusan itu.

// business objects

interface CharRange {
   public char getCharacter();
   public int getFrom();
   public int getTo();
}

class MultiCharRange implements CharRange {
   final char ch;
   final int from;
   final int to;

   public char getCharacter() { return ch; }
   public int getFrom() { return from; }
   public int getTo() { return to; }
}

class SingleCharRange implements CharRange {
   final char ch;
   final int position;

   public char getCharacter() { return ch; }
   public int getFrom() { return position; }
   public int getTo() { return position; }
}

// builders

class Builder1 {
   public Builder2 character(char ch) {
      return new Builder2(ch);
   }
}

class Builder2 {
   final char ch;
   int from;
   int to;

   public Builder2 range(int from, int to) {
      if (from > to) throw new IllegalArgumentException("from > to");
      this.from = from;
      this.to = to;
      return this;
   }

   public Builder2 zeroStartRange(int to) {
      this.from = 0;
      this.to = to;
      return this;
   }

   public CharRange build() {
      if (from == to)
         return new SingleCharRange(ch,from);
      else 
         return new MultiCharRange(ch,from,to);
   }
}

Ini adalah contoh noddy yang tidak masuk akal tetapi menunjukkan ketiga properti: karakter selalu ditetapkan terlebih dahulu, batas rentang selalu ditetapkan dan divalidasi bersama, dan Anda memilih implementasi Anda saat membangun.

Sangat mudah untuk melihat bagaimana hal ini dapat mengarah pada kode pengguna yang lebih mudah dibaca dan dapat diandalkan tetapi seperti yang Anda juga lihat, ada kerugiannya: banyak dan banyak kode pembangun (dan saya bahkan meninggalkan konstruktor untuk mempersingkat cuplikan). Jadi Anda mencoba menghitung pertukaran, dengan mengajukan pertanyaan seperti:

  • Apakah kita hanya membuat instance objek dari satu atau dua tempat? Apakah ini cenderung berubah?
  • Mungkin kita harus menegakkan batasan ini dengan refactoring objek asli ke dalam komposisi objek yang lebih kecil?
  • Akankah kita melewati pembangun dari metode ke metode?
  • Bisakah kita menggunakan metode pabrik statis saja?
  • Apakah ini bagian dari API eksternal, yang harus sangat mudah dan licin, mungkin?
  • Kira-kira berapa banyak tumpukan bug kami saat ini yang bisa dihindari jika kami memiliki pembangun?
  • Berapa banyak penulisan dokumentasi tambahan yang akan kita simpan?

Rekan Anda hanya memutuskan bahwa pertukaran tidak akan bermanfaat. Anda harus mendiskusikan alasan secara terbuka dan jujur, lebih disukai tanpa menggunakan prinsip-prinsip abstrak, tetapi berkonsentrasi pada implikasi praktis dari solusi ini atau itu.

biziclop
sumber
1
dengan mengubah pembuatan objek menjadi suatu proses, Anda dapat menegakkan batasan logis yang kompleks. BAM. Dan semua ini menyiratkan tentang kompleksitas ketika diorganisasikan ke dalam langkah-langkah yang lebih kecil, terpisah, dan sederhana .
radarbob
2

Kedengarannya kelas ini sebenarnya lebih dari satu kelas, disatukan dalam definisi file / kelas yang sama. Jika itu adalah DTO, maka itu harus dimungkinkan untuk instantiate dalam sekali jalan dan agar tidak berubah. Jika Anda tidak menggunakan semua bidang / properti dalam satu transaksi, maka hampir pasti melanggar prinsip Tanggung Jawab Tunggal. Mungkin saja memecahnya menjadi kelas-kelas DTO yang lebih kecil, lebih kohesif, dan abadi dapat membantu. Pertimbangkan untuk membaca Kode Bersih jika Anda belum melakukannya sehingga Anda dapat mengartikulasikan masalah dengan lebih baik, dan manfaat membuat perubahan.

Saya tidak berpikir Anda dapat merancang kode pada tingkat ini dengan komite, kecuali jika Anda benar-benar pemrograman massa (tidak terdengar seperti Anda berada di tim semacam itu), jadi saya pikir tidak apa-apa untuk melakukan perubahan berdasarkan pada Anda penilaian terbaik, dan kemudian mengambil dagu jika ternyata Anda salah menilai.

Namun, selama Anda dapat mengartikulasikan masalah potensial dengan kode seperti itu, maka Anda masih dapat memperdebatkan bahwa solusi diperlukan , bahkan jika Anda bukan yang diterima. Orang-orang kemudian bebas untuk menawarkan alternatif.

" Pendapat yang kuat, dipegang dengan lemah " adalah prinsip yang baik - Anda terus maju dengan keyakinan berdasarkan apa yang Anda ketahui, tetapi jika Anda menemukan beberapa informasi baru yang bertentangan, itu, bersikaplah sederhana dan mundurlah dan masuk ke sebuah diskusi tentang apa solusi yang benar harus menjadi. Satu-satunya jawaban yang salah adalah membiarkannya menjadi lebih buruk.

Neil Barnwell
sumber
Ini jelas tidak dirancang oleh komite yang merupakan bagian dari alasan mengapa kode ini sangat buruk. Kurasa terlalu banyak hal yang baik. Itu adalah DTO tetapi saya tidak akan memecahnya menjadi beberapa bagian; jika basis kode buruk DB jauh, jauh lebih buruk. +1 (terutama) untuk paragraf terakhir.
rath