Pertanyaan OOP: Kelas mana yang harus memiliki metode? [Tutup]


Saya kesulitan memahami cara kelas berhubungan dengan metode mereka. Merupakan metode sesuatu yang objeknya tidak, atau sesuatu yang dilakukan untuk saya t? Atau apakah ini konsep yang berbeda sepenuhnya?

Secara khusus, dalam sistem perangkat lunak perpustakaan, sebaiknya borrow() metode milik kelas yang mewakili patron perpustakaan, atau kelas yang mewakili item yang dipinjam oleh pelindung? Intuisi saya adalah bahwa itu harus dibaca seperti patron.borrow(copy), seperti struktur kalimat bahasa Inggris, subject.verb(object); tetapi instruktur saya mengatakan itu Salah, dan saya tidak mengerti mengapa dia melakukannya borrow() milik Copy kelas (dan dia tidak benar-benar menjelaskan banyak hal dengan baik). Saya tidak mencari pembenaran, tetapi dapatkah seseorang hanya menjelaskan hubungan yang tepat?

Edit: Pertanyaan ini ditutup sebagai "off topic". Saya tidak mengerti. Apakah pertanyaan desain perangkat lunak tidak sesuai untuk situs ini?


32
2018-04-26 05:47


asal


Jawaban:


Beberapa kata generik pertama.

Konstruksi perangkat lunak bukanlah sesuatu yang harus diatur oleh aturan bahasa Inggris atau "kecantikan" atau apa pun, itu adalah disiplin teknik. Pikirkan apakah desain Anda memecahkan masalah, apakah akan dipelihara, apakah akan diuji, apakah mungkin untuk memparalelkan pembangunan dan seterusnya. Jika Anda menginginkan sesuatu yang lebih formal, lihatlah "Pada Kriteria Yang Akan Digunakan dalam Mengurai Sistem ke dalam Modul" oleh D. L. Parnas.

Adapun contoh perpustakaan Anda. Bayangkan Anda memiliki Copy di luar perpustakaan, shoult yang dimilikinya borrow metode itu? Bagaimana peminjaman didaftarkan? Apakah Anda baik dengan kelas Copy atau Patron yang bertanggung jawab untuk penyimpanan data? Terlihat lebih tepat untuk ditaruh borrow menjadi kelas Perpustakaan. Tanggung jawab akan dibagi secara jelas, Anda tidak perlu tahu banyak tentang meminjam untuk mengimplementasikan Copy dan Patron dan Anda tidak perlu banyak detail tentang mereka untuk mengimplementasikan Perpustakaan.


8
2018-04-26 07:35



:) subjektif tapi jujur, saya akan pergi dengan Pola Pakar Informasi dan katakan sesuatu seperti

library.lend(item, patron)

Perpustakaan berisi informasi tentang barang-barangnya (mungkin dalam katalognya).
Perpustakaan meminjamkan item ke patron (yang ia tahu karena itu mendaftarkannya)

Tidak yakin bagaimana instruktur Anda melihat ini, tetapi ini adalah tingkat 'abstraksi' (objek perangkat lunak yang meniru entitas dunia nyata) yang masuk akal untuk skenario Anda.


12
2018-04-26 05:56



Anda tidak boleh mengacaukan ide OOP dengan satu inkarnasi tertentu seperti Java atau C ++.

Batas ini "metode adalah milik objek" bukan bagian dari ide OOP, tetapi hanya beberapa implementasi dan ketika Anda menemukan itu tidak skala dengan baik.

Berapa banyak metode yang bisa dilakukan oleh objek "integer number"? Apa yang lebih logis ... myfile.write(myint) atau myint.write(myfile)? Sebenarnya tidak ada jawaban umum yang bagus untuk ini. Gagasan tentang metode yang menjadi bagian dari objek tunggal adalah kasus khusus dan kadang-kadang pembengkokan yang diperlukan agar sesuai dengan masalah untuk solusi ini dapat menjadi nyata atau bahkan mendekati showstopper. Jawabannya benar-benar dapat diterima hanya jika suatu metode tidak memiliki parameter kecuali objek yang sedang diproses: pengiriman tunggal adalah jawaban sempurna hanya jika ada satu jenis yang terlibat.

Dalam bahasa lain Anda memiliki pemisahan antara objek dan metode, jadi misalnya Anda memiliki objek file, objek integer dan metode write(myfile, myint) yang menjelaskan apa yang harus dilakukan ketika operasi diperlukan ... dan metode ini bukan bagian dari file atau dari integer.


10
2018-04-26 05:59



Metode publik yang diekspos dari kelas adalah tugas yang dapat dilakukan pada entitas. Dengan cara itu kelas hanya akan merangkum perilakunya.

Sebagai contoh: jika saya katakan

Computer.TurnOn ()

Metode ini hanya akan bekerja pada sistem komputer.

sebaliknya jika saya berkata,

SomeOne.TurnonComputer ()

Seseorang sekarang akan memiliki tanggung jawab untuk menghidupkan komputer (mengatur properti komputer yang terkait), itu berarti kita tidak memenuhi konsep enkapsulasi dan menyebarkan properti kelas di semua tempat.


3
2018-04-26 06:17



Seperti yang dikatakan @Ryan Fernandes, operasi peminjaman / pinjaman tidak dapat dilakukan dengan patron atau buku. Itu harus dengan beberapa kelas yang tahu tentang status semua buku dan pelanggan perpustakaan. Misalnya, apakah ada pemesanan yang tertunda terhadap buku? Berapa banyak salinan yang tersedia? Apakah pelindung ini membayar semua biaya? Apakah dia memenuhi syarat untuk buku ini? Jadi biasanya ini harus di Perpustakaan atau kelas LibraryService.


3
2018-04-26 06:03



Titik OOP adalah untuk menciptakan fungsi polimorfik yang, dalam setiap implementasi, berurusan dengan kumpulan data yang ditentukan yang mematuhi invarian tertentu.

Oleh karena itu, metode yang mengubah suatu objek harus didefinisikan dalam kelas objek itu. Itu kurang penting di mana kode yang murni kehidupan fungsional, tetapi mungkin harus hidup pada jenis inputnya (jika ia membutuhkan satu input) atau pada outputnya.

Dalam contoh Anda, jika borrow mengubah data dalam copy, maka seharusnya tinggal di sana. Namun, jika Anda mencontohkan status pinjaman dari sebuah buku olehnya yang disimpan dalam koleksi tertentu (baik dalam pelindung, atau dalam koleksi untuk perpustakaan), akan lebih masuk akal untuk menempatkan borrow pada kelas pemegang. Desain yang terakhir, bagaimanapun, menjalankan risiko bahwa salinan bisa lebih dari satu koleksi, jadi Anda ingin meletakkan beberapa informasi (dan metode yang sesuai) pada salinan juga.


3
2018-04-26 07:44



Tidak cukup yakin untuk pembenaran yang tepat, tetapi Anda dapat berpikir seperti ini, JIKA beberapa pasien pergi dan mengunjungi dokter, hanya dokter yang tahu kapan harus memanggil pasien berikutnya, sehingga metode selanjutnya akan menjadi bagian dari Tanggung Jawab Dokter , meskipun tergoda untuk berpikir bahwa selanjutnya harus menjadi bagian dari tanggung jawab pasien karena ia harus pergi berikutnya, suatu saat ketika buku perpustakaan akan dikeluarkan, itu harus menjadi tanggung jawab buku bergenre agak patron sebagai buku (SUMBER) tahu kapan akan bebas .


1
2018-04-26 05:53



Apakah metode adalah sesuatu yang dilakukan objek, atau sesuatu yang dilakukan terhadapnya? Atau apakah ini konsep yang berbeda sepenuhnya?

Biarkan saya jelaskan sesuatu tentang kelas dan objek terlebih dahulu. Class biasanya digunakan untuk menunjukkan kategori tertentu. Seperti

  1. Mobil  tidak Ferrari, atau Porsche
  2. Buah-buahan  tidak Pisang, atau Apple

Jadi, itu Ferrari yang digerakkan, dan pisang yang dimakan. Bukan kelas mereka

Selalu benda yang memiliki sifat dan memiliki perilaku.

Bahkan pergi ke kasusmu secara khusus.


1
2018-04-26 06:12



Saya kira itu bisa jalan baik. Tidak ada aturan yang keras dan cepat untuk itu. Idenya adalah fungsi kelompok secara logis yang masuk akal. Untuk saya, Patron#borrow(BookCopy) masuk akal sama BookCopy#borrow(Patron). Atau Anda mungkin memiliki kelas LibManager.borrow(BookCopy, Patron).


0
2018-04-26 06:03



Instruktur Anda benar. Yah, sebenarnya, dia salah. Aku tidak tahu.

Maksud saya adalah, untuk pertanyaan seperti ini, seringkali tidak ada jawaban umum yang pasti dari satu atau lain cara. Ini sebagian besar bermuara pada apa yang terbaik dalam kasus Anda. Pergi dengan apa pun yang paling mudah untuk dikodekan - itu akan menjadi yang termudah untuk dipelihara. Dan, dengan "termudah untuk kode", saya sarankan juga dengan mempertimbangkan pengguna kelas yang dituju (di luar hanya Anda Library, Copy dan Person kelas).


0
2018-04-26 06:04