Bagaimana Anda mendekati desain kelas di OOP?


12

Ketika saya mencoba merancang solusi OO, saya biasanya menggunakan pemodelan CRC di mana saya mencantumkan nama kelas (kata benda), apa yang mereka lakukan (kata kerja) dan bagaimana mereka berkolaborasi dengan kelas lain.

Blog ini memiliki hal di bawah ini untuk dikatakan tentang pendekatan kata benda ini

   ...This approach, which I will call “noun and verb,” is so limited 
   I’ll dare to call it brain damaged....

Pertanyaan saya adalah, apakah ada teknik pemodelan yang lebih baik untuk menggunakan pendekatan OO?


1
Dengan asumsi bahwa penawaran $$$ masuk akal, mulailah mengkode. Saat macet, temukan cara untuk menghilangkan hambatan. Faktor ulang nanti. "CRC" bukanlah sesuatu yang telah saya dengar sebelumnya, tetapi itu tidak menghentikan saya dari menulis kelas. Jika ada prinsip mekanis yang hebat di luar sana, seseorang akan membuat alat analisis kode yang baik menggunakannya dan itu akan populer. Sampai saya menemukan hal seperti itu, saya akan terus menggunakan intuisi saya. Tentu saja, kita harus menggunakan kata kerja dan kata benda di tempat yang tepat ...
Ayub

1
Ya. Hanya dapatkan model mental cepat dari sistem dan mulai menulis kode. Saya tahu banyak orang akan tidak setuju dengan saya di sini, tetapi Anda dapat menganalisis hal ini sampai mati. Selama Anda memiliki jumlah pengalaman yang layak, Anda harus memiliki petunjuk tentang apa yang akan dan tidak akan berhasil. Jika sesuatu terbukti sulit untuk dikerjakan sejak dini maka ubahlah, dan sekarang Anda memiliki lebih banyak pengalaman.
Ed S.

Jawaban:


12

Dalam keadilan, dia menambahkan "Bersenang-senang" ke klaim itu.

Sampai hari ini, saya cenderung memulai dengan memodelkan sistem menggunakan pendekatan "kata benda dan kata kerja", tetapi saya telah menemukan selama bertahun-tahun bahwa TDD mengajarkan kita bahwa pendekatan ini menarik fokus Anda ke hal yang salah. Dalam hal ini, blogger benar. Namun, saya tidak yakin bahwa itu adalah pendekatan yang salah, daripada cara pikiran kita bekerja.

Jika Anda ingin mencoba sedikit tantangan di sini, berhenti membaca dan coba model permainan Monopoli, menggunakan bahasa Inggris, lalu kembali ke sini.

Saya curiga godaannya adalah untuk segera melihat benda-benda yang sering berinteraksi dengan kita - papan, ruang, kartu, dadu, potongan-potongan - tetapi itu bukanlah tempat di mana sebagian besar logika mengalir. Sebagian besar benda-benda ini sepenuhnya bodoh. Data, jika Anda mau.

Tapi begitu Anda mulai menulis tes, Anda menyadari objek mana yang sejauh ini paling penting dalam permainan apa pun: aturan.

Ingat kertas kecil yang pernah Anda baca saat pertama kali mendapatkan permainan dan tidak berinteraksi lagi sampai ada perselisihan? Versi terkomputerisasi tidak beroperasi seperti itu. Setiap hal yang pemain coba lakukan, komputer akan berkonsultasi dengan aturan dan melihat apakah mereka diizinkan melakukannya atau tidak.

Ketika Anda memikirkannya, Anda melakukan hal yang sama tetapi karena butuh waktu untuk membaca aturan berbasis kertas dan otak Anda memiliki sistem caching yang masuk akal, Anda berkonsultasi dengan aturan di kepala Anda. Sebuah komputer mungkin akan merasa mudah untuk membaca kembali peraturan - kecuali jika disimpan dalam basis data, dalam hal ini mungkin akan menyimpannya juga.

Dan inilah mengapa TDD sangat populer untuk desain mengemudi sebenarnya. Karena itu cenderung mendorong proses berpikir Anda dengan cepat ke tempat yang tepat:

Ketika saya berpikir bahwa saya akan menulis beberapa tes untuk permainan Monopoli saya. Saya mungkin melihat set saya dan mencoba menemukan objek. Jadi, kami punya potongan-potongan ini. Saya akan menulis beberapa tes untuk itu.

Mungkin saya akan memiliki kelas dasar MonopolyPiece dan setiap jenis karya akan berasal dari mereka. Saya akan mulai dengan DogPiece. Tes pertama ... ahh. Sebenarnya tidak ada logika di sini. Ya, masing-masing bagian akan ditarik secara berbeda, jadi saya mungkin perlu DogDrawer, tapi sementara saya menyempurnakan permainan, saya hanya ingin menulis "D" di layar. Saya akan membumbui UI pada akhirnya.

Mari kita cari logika yang sebenarnya untuk diuji. Ada banyak rumah dan hotel ini, tetapi mereka tidak perlu tes. Uang, tidak. Kartu properti, tidak. Dan seterusnya. Bahkan papan tidak lain adalah mesin negara, itu tidak mengandung logika apa pun.

Anda akan segera menemukan ada tiga hal yang tersisa di tangan Anda. Kartu Peluang dan Dada Komunitas, sepasang dadu dan seperangkat aturan. Ini akan menjadi bagian penting untuk dirancang dan diuji.

Apakah Anda melihat itu datang ketika Anda menulis kata benda dan kata kerja?

Faktanya, ada contoh yang bagus dalam Pola dan Praktek Prinsip Agile Robert Martin di mana mereka mencoba menyempurnakan aplikasi Kartu Skor Bowling menggunakan TDD dan menemukan segala macam hal yang mereka pikir adalah kelas yang jelas tidak perlu diganggu.


Tidak dapat memahami mengapa TDD merupakan jawaban untuk membuat analisis OO yang ditanyakan OP. Kata benda / kata kerja adalah pendekatan pertama dari domain masalah (paling berguna untuk pemula), dan tentu saja pemurnian kelas dapat dilakukan nanti, tetapi klaim TDD mengarahkan desain ke arah yang benar adalah IMHO yang salah (apakah Anda benar-benar menyarankan lewati perencanaan , desain dan mulai koding ?!). Contoh Monopoly juga menyesatkan, tergantung pada bagian mana dari sistem yang sedang Anda kerjakan: UI atau logika inti. Di UI sisi dadu dan yang lainnya masuk akal.
Roman Susi

+1 & favorit. Pertama, pengalaman saya adalah bahwa TDD mendorong proses pemikiran Anda dengan cepat ke tempat yang tepat (Yah, kadang-kadang Anda mungkin berdebat tentang "cepat"). Dan itu dapat membantu mengungkapkan cacat desain lebih awal juga: Anda akan belajar injeksi ketergantungan jika tidak ada yang lain! Noun-Verb - siapa yang tidak memulai dari sini? Tetapi sebagian besar dari benda-benda ini sepenuhnya bodoh. Data, jika Anda mau sangat mendalam. Judul buku mani mengatakan semuanya untuk saya Algoritma + Struktur Data = Program
radarbob

3

Saya tidak pernah menemukan metode seperti itu bermanfaat bagi saya. Bahkan saya menemukan bahwa menggunakan mereka justru membingungkan saya lebih buruk. Lihat Pembuat Kopi Robert C. Martin , saya juga tidak berpikir dia menggunakan pendekatan semacam ini.

Satu hal yang langsung menggangguku adalah solusi yang diberikan orang tersebut pada artikel CRC yang Anda tautkan. Kolaborasi Pelanggan / Pesanan bukanlah sesuatu yang saya anggap berharga, tidak seperti yang tertulis. Tidak ada yang menarik dalam model tentang Pelanggan yang layak mendapatkan status kelas. Satu-satunya hal yang menarik tentang menjadi "pelanggan" adalah ada satu atau lebih pesanan yang terkait dengan Orang itu .

Model perguruan tinggi juga. Ada banyak hal yang dapat dilakukan, dan mungkin harus dibagikan antara Mahasiswa dan Profesor. Lebih jauh, apa yang terjadi ketika Anda memiliki seorang Profesor yang mengambil kelas, seperti yang sering kali diberikan secara gratis di kampus-kampus?

Saya kira itu mungkin praktik yang bermanfaat, satu elemen dalam toolkit desain. Saya tidak berpikir itu harus menjadi satu-satunya cara Anda mendekati desain setidaknya. Terus terang, saya menemukan pendekatan analisis kesamaan / variasi lebih berguna. Tampaknya bagi saya untuk memodelkan sangat erat apa yang kita lakukan dalam mengklasifikasikan abstraksi selama kehidupan sehari-hari.

Sunting: Cukup baca setengah dari blog kedua itu dan saya harus mengatakan bahwa saya cukup setuju dengannya. Saya harus membaca sisanya dan melihat apa yang ditawarkannya dalam hal belajar.


2
Kesalahan: Baris 2: Hyperlink tidak valid!
Cracker

1
Perangkat lunak SE menyembunyikannya. Itu berfungsi dengan baik pada pratinjau. Berikut tautan dalam bentuk teks: objectmentor.com/resources/articles/CoffeeMaker.pdf
Edward Strange

0

Pendapat saya adalah bahwa kelas harus ditambahkan (dan dihapus) saat Anda membuat kode untuk memisahkan masalah dan mengurangi ketergantungan. Menjadi fasih dalam pola desain mungkin merupakan taruhan yang baik untuk melihat kemungkinan refactoring dan penyederhanaan.

Kelas secara umum, menurut pengalaman saya, tidak masuk dalam kategori kata benda / kata kerja tetapi sebaliknya Anda akan berakhir dengan campuran kelas kata benda / kata kerja bersama dengan kelas pola yang berbeda (pabrik, lajang, pola strategi dll) dan kelas manajer lainnya yang membahas aspek aplikasi Anda.

Kuncinya adalah bahwa tujuan Anda harus dapat melihat kelas dan menyimpulkan apa yang dilakukannya dan memodifikasinya dengan hanya mengubah kelas itu. Semakin banyak kode untuk aspek aplikasi Anda tersebar di antara kelas, semakin sulit untuk mengikuti, mengelola, dan memperluasnya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.