Kode itu hidup dan mati. Bagian Dua Tindakan dan properti

Terakhir kali, saya menulis bahwa nama-nama objek sangat penting, dan bahwa mereka harus dipilih dengan cermat dan memperhatikan detail. Nama buruk membuat takut dan tidak memungkinkan untuk memahami esensi dari apa yang terjadi. Tapi apa esensi ini?


Sulit untuk mengevaluasi seorang pahlawan tanpa memahami "statistik" dan "kemampuan" -nya. Apa yang dia bisa dan apa yang dia mampu adalah tingkat kesulitan berikutnya yang harus kita selami. Itu tidak cukup untuk mencerminkan tempat perlindungan internal objek dengan bantuan nama yang tepat, Anda juga perlu memastikan bahwa ini adalah tempat perlindungan yang sama, dan bukan istal dari pengambil.


Tentang ini - dalam artikel ini.


Siklus daftar isi


  1. Benda-benda
  2. Tindakan dan properti
  3. Kode sebagai teks

Tindakan


Serangan karakter, membela, berkelit, menembak dari busur, menggunakan mantra, melambaikan pisau. Nama mencerminkan objek, tetapi objek itu sendiri bergerak, bereaksi, beraksi. Kalau tidak, kita akan berbicara tentang tabel di Excel.


Dalam C #, tindakan adalah metode dan fungsi. Dan bagi kita: kata kerja, atom gerakan verbal. Kata kerja bergerak waktu, karena benda-benda itu ada dan berinteraksi. Di mana ada perubahan - harus ada kata kerja.


Setter


Dari semua perubahan, penugasan adalah yang paling penting dari semua yang dapat dipindahkan. Ini secara ketat dan matematis menggambarkan apa kuantitas dan apa yang mereka sama dengan, tetapi tidak pernah mengkomunikasikan kehidupan dan semangat ke teks, seperti kata kerja.


Misalnya, ada IPullRequest dengan properti Status , yang dapat Approved , Declined atau Merged . Anda dapat menulis pullRequest.Status = Status.Declined , tetapi ini sama dengan mengatakan "Setel permintaan kumpulan ke status yang dibatalkan," adalah keharusan. Jauh lebih kuat adalah pullRequest.Decline() dan, karenanya, pullRequest.Approve() , pullRequest.Merge() .


Kata kerja aktif lebih disukai daripada seorang setter, tetapi tidak semua kata kerjanya.


Suara pasif


PerformPurchase , DoDelete , MakeCall .


Seperti di HeroManager kata benda penting dikaburkan oleh Manager tidak berarti, demikian juga di PerformMigration - Perform . Lagi pula, lebih hidup - hanya Migrate !


Kata kerja aktif menyegarkan teks: bukan "hit" , tetapi "hit" ; bukan "membuat ayunan" , tetapi "melambai" ; bukan "membuat keputusan" , tetapi "memutuskan" . Jadi dalam kode: PerformApplicationApply ; DoDeleteDelete ; PerformPurchasePurchase , Buy . (Tapi DealDamage tenang, meskipun dalam kasus yang jarang terjadi Attack mungkin dimaksudkan .)


Menghindari suara pasif, kami mengembangkan cerita, memindahkan karakter, tetapi kami juga perlu memastikan bahwa film tidak berubah menjadi hitam putih.


Kata kerja yang kuat


Beberapa kata menyampaikan nuansa makna lebih baik daripada yang lain. Jika Anda menulis "dia minum segelas air" , itu akan menjadi sederhana dan jelas. Tapi "tiriskan segelas air" - kiasan, lebih kuat.


Jadi perubahan kesehatan pemain dapat diekspresikan melalui pemain. Kesehatan player.Health = X atau player.RestoreHealth . player.RestoreHealth , tetapi yang lebih indah adalah player.RestoreHealth . player.RestoreHealth .


Atau, misalnya, kita tahu Stack bukan dengan Add/Remove , tetapi oleh Push/Pop .


Kata kerja yang kuat dan aktif memenuhi objek dengan perilaku, jika mereka tidak terlalu spesifik.


Bagian yang berlebihan


Seperti dengan ManualResetEvent , semakin dekat kita ke internal teknis .NET, yang rumit dan akan menyenangkan jika hanya mengekspresikannya, semakin kaya detail dan kelebihan dari API.


Kebetulan Anda perlu melakukan beberapa pekerjaan pada utas lainnya, tetapi agar tidak repot membuat dan menghentikannya. Di C # ada ThreadPool untuk ini. Hanya di sini adalah "melakukan pekerjaan" sederhana di sini - QueueUserWorkItem ! Apa item pekerjaan ( WorkItem ) itu dan apa yang bisa, jika bukan pengguna ( User ), tidak jelas. Jauh lebih mudah adalah - ThreadPool.Run atau ThreadPool.Execute .


Contoh lain. Mengingat dan mengetahui bahwa ada instruksi atom compar-and-swap (CAS) baik, tetapi porting itu bersih ke kode bukan solusi terbaik. Interlocked.CompareExchange(ref x, newX, oldX) lebih rendah daripada Atomically.Change(ref x, from: oldX, to: newX) (menggunakan parameter bernama).


Kode ini bukan gelar doktor dalam bekerja dengan komputer kuantum, bukan aplikasi untuk perhitungan matematis, tetapi pembaca terkadang sama sekali tidak peduli dengan apa yang disebut instruksi tingkat rendah. Penggunaan sehari-hari adalah penting.


Pengulangan


UsersRepository.AddUser , Benchmark.ExecuteBenchmark , AppInitializer.Initialize , UniversalMarshaller.Marshal , Logger.LogError .


Seperti yang saya katakan di bagian terakhir, pengulangan mengikis makna, mengompres ruang.


Bukan UsersRepository.AddUser , tetapi UsersRepository.Add ; bukan Directory.CreateDirectory , tetapi Directory.Create ; bukan HttpWebResponse.GetResponseStream , tetapi HttpWebResponse.Stream ; bukan Logger.LogError , tetapi Log.Error .


Sampah yang bagus


Check adalah kata yang banyak sisi. CheckHasLongName dapat mengembalikan bool atau melemparkan pengecualian jika pengguna memiliki nama yang terlalu panjang. Lebih baik bool HasLongName atau void EnsureHasShortName . Saya bahkan bertemu CheckRebootCounter , yang ... Di suatu tempat di dalam, restart IIS!


Enumerate - dari seri yang sama. Dalam. NET ada metode Directory.EnumerateDirectories(path) : untuk beberapa alasan, ditentukan bahwa folder akan terdaftar, meskipun Directories.Of(path) atau path.Directories() .


Calc - Calculate sangat sering dikurangi, meskipun lebih mirip deposito kalsium.


Proc adalah singkatan mewah untuk Process .


Base , Impl , Internal , Raw - kata parasit yang menunjukkan kompleksitas objek.


Total


Sekali lagi, seorang pembaca yang penuh perhatian akan memperhatikan, semuanya berujung pada penyederhanaan, untuk menyamakan ucapan alami, dan tip-tip itu sendiri sebagian besar berhubungan tidak hanya dengan kode, tetapi dengan menulis secara umum. Dengan menggunakannya, pengembang memoles kode sebagai teks dan teks itu sendiri, berusaha untuk presentasi yang transparan dan halus, untuk kesederhanaan.


Sekarang kita telah mengetahui pergerakan dan "efek khusus," mari kita lihat bagaimana hubungan antara objek dijelaskan.


Sifat-sifat


Karakter memiliki kesehatan dan mana; barang ada di keranjang belanja; tata surya terdiri dari planet-planet. Objek tidak hanya bertindak tanpa pamrih, tetapi juga berhubungan: secara hierarkis (leluhur-pewaris), komposisi (seluruh bagian), spasial (elemen penyimpanan), dll.


Dalam C #, properti dan hubungan adalah metode (biasanya dimulai dengan Get ), getter (properti dengan tubuh get spesifik), dan bidang. Tetapi bagi kita itu adalah: penambahan kata-kata yang mengekspresikan kepemilikan dari satu objek ke objek lainnya. Sebagai contoh, seorang pemain memiliki kesehatan - Player.Health , yang hampir persis sesuai dengan "kesehatan pemain" bahasa Inggris.


Yang paling membingungkan saat ini adalah metode tindakan dan metode properti.


Verb bukannya kata benda


GetDiscount , CalculateDamage , FetchResult , ComputeFov , CreateMap .


Settle terdengar di mana-mana: metode harus dimulai dengan kata kerja. Anda jarang melihat orang meragukan: apakah ini benar-benar terjadi? Bagaimanapun, tidak ada perbedaan yang signifikan antara Player.Health dan Player.Health() . Biarkan rekaman berbeda secara sintaksis, artinya sama.


Misalkan, di IUsersRepository beberapa GetUser(int id) mudah diharapkan. Mengapa, untuk mewakili pengguna, pikirkan semacam tanda terima ( Get )? Ini akan lebih akurat - User(int id) !


Dan sungguh: bukan FetchResult() , tetapi Result() ; bukan GetResponse() , tetapi Response() ; bukan CalculateDamage() , tetapi Damage() .


Satu ceramah DDD memberikan contoh kode "baik": DiscountCalculator dengan metode CalculateDiscountBy(int customerId) . Tidak hanya ada pengulangan simetris di wajah - DiscountCalculator.CalculateDiscount , mereka juga menentukan bahwa diskon dihitung . Dan apa lagi, yang satu minta, lakukan padanya?


Akan lebih kuat untuk pergi dari entitas itu sendiri - Discount dengan static decimal Of(Customer customer, Order order) metode untuk memanggil Discount.Of(customer, order) - lebih sederhana daripada _discountCalculator.CalculateDiscountBy(customerId) , dan sesuai dengan satu bahasa.


Terkadang, dengan menghilangkan kata kerja, kita kehilangan sesuatu, seperti, katakanlah, di CreateMap() : penggantian langsung dengan Map() mungkin tidak cukup. Maka solusi terbaik adalah NewMap() : objeknya lagi di kepala, bukan tindakan.


Penggunaan kata kerja kosong kosong adalah karakteristik dari budaya imperatif yang sudah usang, di mana algoritme utamanya dan di depan konsep. Di sana Anda akan sering menemukan "bilah yang telah ditempa" daripada "bilah yang mengeras" . Tetapi gaya buku-buku tentang James Bond tidak cocok untuk menggambarkan lanskap. Di mana tidak ada gerakan, tidak ada tempat untuk kata kerja.


Lainnya


Properti dan metode yang mengekspresikan hubungan antara objek juga objek, oleh karena itu, yang disebutkan di atas dalam banyak hal berlaku untuk mereka.


Misalnya, pengulangan di properti: bukan Thread.CurrentThread , tetapi Thread.Current ; bukan Inventory.InventoryItems , tetapi Inventory.Items , dll.


Total


Kata-kata sederhana dan mudah dimengerti tidak membingungkan, dan karena itu kode yang terdiri dari mereka juga tidak bingung. Dalam menulis, sama pentingnya untuk menulis dengan mudah: hindari preposisi pasif, banyak adverbia dan kata sifat, repetisi, untuk tindakan yang lebih memilih kata kerja daripada kata benda. Contoh terkenal: "Dia menganggukkan kepalanya, setuju", bukannya "Dia mengangguk," menyebabkan senyum, dan saya ingat QueueUserWorkItem .


Teks dari kode juga berbeda karena dalam kasus pertama Anda akan dibayar jika rumah berdiri, tenggelam dalam sinar matahari terbenam ; yang kedua - jika rumah itu berdiri ; tetapi perlu diingat: rumah harus berdiri, dan tidak menempel pada pembantu.


Dalam dua artikel pertama dari seri ini, saya ingin menunjukkan betapa pentingnya bekerja tidak hanya pada algoritma, tetapi juga pada kata; bagaimana nama menentukan isi dari apa yang disebut; bagaimana kode yang berlebihan dan rumit mendorong pembaca pergi.


Bersamaan dengan ini, nama baik hanya catatan. Untuk bermain , mereka harus ditulis dan diwujudkan dalam musik. Saya akan memberi tahu Anda lebih banyak di artikel terakhir berikutnya.

Source: https://habr.com/ru/post/id447674/


All Articles