Apakah kelas statis dengan metode statis dianggap SOLID?

27

SOLID termasuk prinsip substitusi Liskov yang berpendapat bahwa "objek dalam suatu program harus diganti dengan instance subtipe mereka tanpa mengubah kebenaran program itu".

Karena kelas statis dengan metode statis (sedikit seperti Mathkelas) tidak memiliki instance sama sekali, apakah sistem saya dianggap SOLID jika saya memiliki kelas statis dengan metode statis?

Pacerier
sumber
Saya pikir pertanyaan ini bagus. Mari kita lihat apa yang ditawarkan komunitas.
Saeed Neamati
1
Kelas matematika tidak termasuk negara. Jadi, Anda tidak pernah benar-benar melewati objek jenis ini. Jadi saya tidak yakin bagaimana ini bahkan relevan.
Martin York
Saya tidak berpikir kelas statis benar-benar bisa dikatakan SOLID murni (banyak karena beberapa alasan yang sama seperti yang telah disebutkan) namun saya akan menganggap mereka sebagai pembela yang hebat dan alat untuk prinsip KERING.
dreza
2
Bagaimana? Dari pengalaman saya, terlalu sering menggunakan kelas statis sebagian besar menghasilkan orang mengulangi diri mereka sendiri sepanjang waktu dengan setengah kode memanipulasi satu objek dewa statis global.
back2dos
1
Saya kira saya berpikir lebih dalam hal kelas utilitas untuk memberikan kode umum. Saya setuju mereka mudah dan sering salah digunakan tetapi masih berpikir bahwa dapat memberikan cara yang berguna untuk mengelompokkan kode bersama di mana negara bukan masalah
dreza

Jawaban:

27

LSP berlaku untuk melewatkan instance kelas ke dalam metode, meminta metode melakukan beberapa hal dengan instance itu, dan sering menghasilkan semacam hasil. Ini tidak masalah untuk kelas statis karena di C # Anda tidak dapat membuat turunan dari kelas statis.

Yang lebih penting lagi, kelas statis disegel dan karenanya tidak dapat diwarisi. Ini membuat pertanyaan Anda dapat diperdebatkan sejauh C # berjalan.

Anda bisa mengatakan bahwa kelas statis selalu sesuai dengan LSP karena Anda tidak pernah dapat menghasilkan subkelas yang akan melanggar prinsip itu. Anda juga bisa mengatakan bahwa kelas statis tidak pernah sesuai dengan LSP untuk alasan yang sama.


Di Jawa, kelas statis sedikit berbeda. Anda tidak dapat menandai kelas tingkat atas sebagai "statis", jadi jika Anda ingin membuat kelas utilitas yang mirip dengan kelas statis C #, Anda harus mendeklarasikannya sebagai finaldan menyembunyikan konstruktornya. Namun, begitu Anda melakukannya, mereka berperilaku serupa dengan C # - Anda tidak dapat membuat instance atau subklasnya. Anda bisa mendeklarasikan kelas dalam sebagai static, tetapi itu tidak berarti hal yang sama seperti di C #: itu hanya menunjukkan kelas tingkat atas bersarang .

VB.NET berperilaku persis sama dengan C # dalam kasus ini, sejauh yang saya tahu.


Anda tidak menyebutkan apakah Anda tertarik pada prinsip-prinsip lain, tetapi saya tetap akan memasukkannya untuk kelengkapan.

S prinsip tanggung jawab perapian di tungku : kelas statis dengan mudah mengikuti prinsip ini.
O pena / prinsip tertutup : karena kelas statis disegel, mereka tidak dapat mengikuti prinsip ini. Prinsip substitusi
L iskov : seperti di atas.
Saya menerapkan prinsip segregasi : tidak berlaku untuk satu kelas, tetapi memecah satu kelas statis besar menjadi lebih kecil, yang lebih khusus dapat menjadi langkah menuju mengikuti prinsip ini.
D prinsip ependency inversi : kelas statis tidak dapat mengimplementasikan antarmuka, sehingga setiap kelas menggunakannya akan selalu bergantung pada pelaksanaan apa pun yang ada pada saat itu. Kelas statis karenanya melanggar prinsip ini.

Karena kelas statis tidak memenuhi semua 5 kriteria, mereka tidak SOLID.

Adam Lear
sumber
karena menjadi SOLID berarti kita harus memenuhi semua 5 kriteria, bukankah itu berarti mereka tidak SOLID?
Pacerier
1
@Pacerier Ya, tetapi orang tidak boleh mencoba menyuruh kelas menjadi SOLID sepanjang waktu jika tidak diperlukan; itu tergantung pada konteks kelas. Jika ini adalah kelas utilitas atau sesuatu, tidak apa-apa IMO untuk tidak menjadi "SOLID", tetapi jika itu adalah kelas domain aktual yang memiliki penggunaan domain spesifik ...
Wayne Molina
4

Saya tidak akan mengklasifikasikan kelas semacam itu sebagai berorientasi objek dan oleh karena itu saya akan mengatakan bahwa itu tidak dapat (dan tidak boleh mencoba) memenuhi prinsip-prinsip desain berorientasi objek.

Kelas-kelas ini hanyalah solusi untuk ketidakmampuan untuk menyediakan kode di luar kelas dalam bahasa seperti Java dan C #. Jika mereka bisa, mereka harus didefinisikan sebagai fungsi mandiri karena mereka tidak mendapatkan manfaat apa pun dari orientasi objek.

Gyan alias Gary Buyn
sumber
Saya tidak setuju dengan menempatkan fungsi yang berdiri sendiri di luar kelas. Kemampuan sederhana untuk mengelompokkan fungsi terkait (statis atau tidak) dengan nama umum berguna untuk keterbacaan. Fungsi matematika sesuai dengan tagihan.
jojo
2
@ jojo Setuju. Bahasa yang mendukung fungsi yang didefinisikan di luar kelas juga mendukung pengelompokan logis dari fungsi-fungsi ini misalnya ruang nama di C ++.
Gyan alias Gary Buyn
2

Layak disebutkan, karena Anda tidak menentukan bahasa, bahwa di C ++ Anda dapat melewati kelas-kelas di sekitar yang hanya memiliki anggota statis dan mengakses anggota tersebut melalui templat, dan oleh karena itu dimungkinkan untuk mengganti kelas dengan hanya anggota statis, dan bisa dibilang, metode disebut bentuk itu "antarmuka".

DeadMG
sumber
vb.net / c # / java
Pacerier