Latar Belakang
Saya sedang membaca "buku Kode Bersih", dan, secara paralel, saya sedang mengerjakan objek senam Kata seperti rekening bankir, dan saya terjebak pada aturan itu:
Aturan 9 dari objek senam adalah kita tidak menggunakan pengambil atau setter.
Tampaknya cukup menyenangkan, dan saya setuju dengan prinsip ini. Terlebih lagi, pada halaman 98-99 dari Clean Code, penulis menjelaskan bahwa pengambil / pemecah gelombang memutuskan abstraksi, dan bahwa kita tidak harus menanyakan objek kita, tetapi kita harus memberi tahu objek kita.
Ini masuk akal dalam pikiran saya, dan saya sepenuhnya setuju dengan prinsip ini. Masalahnya muncul dalam praktik.
Konteks
Sebagai contoh, saya memiliki aplikasi di mana saya harus mendaftar beberapa pengguna, dan untuk menampilkan detail pengguna.
Pengguna saya terdiri dari:
-> Name
--> Firstname --> String
--> Lastname --> String
-> PostalAddress
--> Street --> String
--> PostalCode --> String
Masalah
Bagaimana saya bisa melakukan, atau apa yang bisa saya lakukan untuk menghindari getter ketika saya hanya perlu menampilkan informasi sederhana ( dan saya harus mengonfirmasi bahwa saya tidak perlu operasi tambahan pada bidang tertentu ) untuk menampilkan nilai Firstname dengan sederhana ( acak) dukungan keluaran?
Apa yang muncul di pikiran saya
Salah satu solusinya adalah membuat:
user.getName().getFirstName().getStringValue()
Yang benar-benar mengerikan, melanggar banyak aturan benda-benda senam, dan melanggar Hukum Demeter.
Yang lain akan menjadi sesuatu seperti:
String firstName = user.provideFirstnameForOutput();
// That would have called in the user object =>
String firstName = name.provideFirstnameForOutput();
// That would have called in the name object =>
String firstName = firstname.provideFirstnameForOutput();
Tapi saya tidak merasa nyaman dengan solusi ini, yang sepertinya hanya menjadi "pengakses pesanan tingkat tinggi" seperti memintas pembuat / penyetel standar dengan metode yang hanya bertujuan untuk menyesuaikan dengan hukum Demeter ...
Ada ide ?
sumber
Satu arah untuk berpikir adalah untuk menyediakan fungsi anggota pemformatan string generik, daripada menyediakan akses ke data mentah. Sesuatu seperti ini:
Anda lihat, dengan pendekatan ini, Anda tidak dibatasi hanya menyediakan data lengkap seperti apa adanya, Anda dapat menyediakan sarana untuk mengubah data dengan cara yang mudah dan bermakna. Misalnya, Anda mungkin perlu bermain trik dengan huruf besar-kecil:
Anda juga bisa mendefinisikan beberapa format yang umum digunakan, mungkin sekali, jadi Anda bisa mengatakan, misalnya
Keindahan dari pendekatan ini adalah, hal itu membuat string individu internal ke
User
kelas, sementara sebenarnya memberikan fungsionalitas yang lebih signifikan pada kode panggilan. Namun, downside adalah, bahwa Anda perlu menerapkan mekanisme templating diformatDescription()
mana akan ada beberapa baris kode.Dengan demikian, ini mungkin berlebihan: Jangan pernah lupa bahwa prinsip-prinsip pemrograman hanyalah panduan. Dan setiap kali mengikuti prinsip lain melanggar prinsip KISS, mungkin yang terbaik adalah melakukannya dengan cara sederhana. Jadi, kecuali Anda memiliki setidaknya beberapa kebutuhan untuk anggota pemformatan seperti itu, saya tidak akan repot-repot mengimplementasikannya demi kesederhanaan, menggunakan pendekatan berbasis pengakses.
sumber
User
objek untuk mem-parsing dan menyusun / menafsirkan bahasa templating?User
kelas harus mengimplementasikan fungsi ini sendiri. Jika saya hanya memiliki dua kelas yang membutuhkan fungsi seperti itu, Anda bisa bertaruh saya memasukkan mekanisme penggantian template ke dalam kelasnya sendiri. Ini dimaksudkan sebagai contoh bagaimana Anda dapat mengangkat abstraksi yangUser
menyediakan ke tingkat di mana sebenarnya lebih dari sekadar wadah data. Dan saya percaya, itulah yang menghindari aksesor: melakukan OOP daripada menangani sekelompokstruct
s.