Jika Anda merasa harus memperluas satu liner seperti
a = F(G1(H1(b1), H2(b2)), G2(c1));
Aku tidak akan menyalahkanmu. Itu tidak hanya sulit dibaca, tetapi juga sulit untuk di-debug.
Mengapa?
- Ini padat
- Beberapa debugger hanya akan menyoroti semuanya sekaligus
- Ini bebas dari nama deskriptif
Jika Anda mengembangkannya dengan hasil menengah yang Anda dapatkan
var result_h1 = H1(b1);
var result_h2 = H2(b2);
var result_g1 = G1(result_h1, result_h2);
var result_g2 = G2(c1);
var a = F(result_g1, result_g2);
dan masih sulit dibaca. Mengapa? Ini memecahkan dua masalah dan memperkenalkan yang keempat:
Ini padat
Beberapa debugger hanya akan menyoroti semuanya sekaligus
- Ini bebas dari nama deskriptif
- Itu berantakan dengan nama-nama non-deskriptif
Jika Anda mengembangkannya dengan nama yang menambahkan makna baru, bagus, semantik, bahkan lebih baik! Nama yang bagus membantu saya mengerti.
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
Sekarang setidaknya ini menceritakan sebuah kisah. Ini memperbaiki masalah dan jelas lebih baik daripada apa pun yang ditawarkan di sini tetapi mengharuskan Anda untuk datang dengan nama.
Jika Anda melakukannya dengan nama-nama yang tidak berarti seperti result_this
dan result_that
karena Anda tidak bisa memikirkan nama-nama yang baik maka saya benar-benar lebih suka Anda mengacaukan nama yang tidak berarti dan mengembangkannya menggunakan ruang putih tua yang bagus:
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
Ini hanya bisa dibaca, jika tidak lebih, dari yang dengan nama hasil yang tidak berarti (bukan bahwa nama-nama fungsi ini sehebat itu).
Ini padat
Beberapa debugger hanya akan menyoroti semuanya sekaligus
- Ini bebas dari nama deskriptif
Itu berantakan dengan nama-nama non-deskriptif
Ketika Anda tidak bisa memikirkan nama baik, itu sama baiknya dengan namanya.
Untuk beberapa alasan debuggers menyukai baris baru sehingga Anda harus menemukan bahwa debugging ini tidak sulit:
Jika itu tidak cukup, bayangkan G2()
dipanggil di lebih dari satu tempat dan kemudian ini terjadi:
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
Saya pikir itu baik karena setiap G2()
panggilan akan berada di jalurnya sendiri, gaya ini membawa Anda langsung ke panggilan yang menyinggung di utama.
Jadi tolong jangan gunakan masalah 1 dan 2 sebagai alasan untuk mempermasalahkan kami dengan masalah 4. Gunakan nama baik ketika Anda bisa memikirkannya. Hindari nama yang tidak berarti ketika Anda tidak bisa.
Lightness Races dalam komentar Orbit dengan benar menunjukkan bahwa fungsi-fungsi ini adalah buatan dan memiliki nama buruk yang mati sendiri. Jadi, inilah contoh penerapan gaya ini ke beberapa kode dari alam:
var user = db.t_ST_User.Where(_user => string.Compare(domain,
_user.domainName.Trim(), StringComparison.OrdinalIgnoreCase) == 0)
.Where(_user => string.Compare(samAccountName, _user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase) == 0).Where(_user => _user.deleted == false)
.FirstOrDefault();
Aku benci melihat aliran suara itu, bahkan ketika pembungkus kata tidak diperlukan. Begini tampilannya di bawah gaya ini:
var user = db
.t_ST_User
.Where(
_user => string.Compare(
domain,
_user.domainName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(
_user => string.Compare(
samAccountName,
_user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(_user => _user.deleted == false)
.FirstOrDefault()
;
Seperti yang Anda lihat, saya telah menemukan gaya ini bekerja dengan baik dengan kode fungsional yang bergerak ke ruang berorientasi objek. Jika Anda dapat menemukan nama-nama baik untuk melakukan itu dalam gaya menengah maka lebih banyak kekuatan untuk Anda. Sampai saat itu saya menggunakan ini. Tetapi bagaimanapun juga, tolong, temukan beberapa cara untuk menghindari nama hasil yang tidak berarti. Mereka membuat mataku sakit.