Dari sudut pandang prinsip SOLID , jawaban jgauffin masuk akal. Namun, Anda jangan lupa tentang prinsip-prinsip desain umum, misalnya menyembunyikan informasi .
Saya melihat beberapa masalah dengan pendekatan yang diberikan:
- Seperti yang Anda tunjukkan pada diri Anda sendiri, orang tidak berharap untuk menggunakan kata kunci 'baru', ketika objek dibuat tidak mengelola keadaan apa pun . Desain Anda mencerminkan niatnya. Orang-orang yang menggunakan kelas Anda mungkin menjadi bingung tentang apa yang diaturnya, dan apakah panggilan selanjutnya ke metode ini dapat menghasilkan perilaku yang berbeda.
- Dari perspektif orang yang menggunakan kelas keadaan batinnya tersembunyi dengan baik, tetapi ketika ingin membuat modifikasi ke kelas atau hanya memahaminya, Anda membuat hal-hal menjadi lebih kompleks. Saya sudah menulis banyak tentang masalah yang saya lihat dengan metode pemisahan hanya untuk membuatnya lebih kecil , terutama ketika memindahkan status ke ruang kelas. Anda memodifikasi cara API Anda harus digunakan hanya untuk memiliki fungsi yang lebih kecil!Bahwa menurut saya sudah pasti terlalu jauh.
Beberapa referensi terkait
Mungkin argumen utama terletak pada sejauh mana merentangkan Prinsip Tanggung Jawab Tunggal . "Jika Anda membawanya ke ekstrem itu dan membangun kelas yang memiliki satu alasan untuk ada, Anda mungkin berakhir dengan hanya satu metode per kelas. Ini akan menyebabkan bentangan besar kelas bahkan untuk proses yang paling sederhana, menyebabkan sistem menjadi sulit dimengerti dan sulit diubah. "
Referensi lain yang relevan terkait dengan topik ini: "Bagi program Anda menjadi metode yang melakukan satu tugas yang dapat diidentifikasi. Simpan semua operasi dalam metode pada tingkat abstraksi yang sama ." - Kent Beck Key di sini adalah "tingkat abstraksi yang sama". Itu tidak berarti "satu hal", seperti yang sering ditafsirkan. Level abstraksi ini sepenuhnya tergantung pada konteksnya yang Anda rancang.
Jadi apa pendekatan yang tepat?
Tanpa mengetahui case konkret Anda, sulit untuk mengatakannya. Ada skenario di mana saya kadang-kadang (tidak sering) menggunakan pendekatan serupa. Ketika saya ingin memproses dataset, tanpa ingin membuat fungsionalitas ini tersedia untuk seluruh ruang kelas. Saya menulis posting blog tentang itu, bagaimana lambdas dapat lebih meningkatkan enkapsulasi . Saya juga memulai pertanyaan tentang topik di sini di Programmer . Berikut ini adalah contoh terbaru di mana saya menggunakan teknik ini.
new TupleList<Key, int>
{
{ Key.NumPad1, 1 },
...
{ Key.NumPad3, 16 },
{ Key.NumPad4, 17 },
}
.ForEach( t =>
{
var trigger = new IC.Trigger.EventTrigger(
new KeyInputCondition( t.Item1, KeyInputCondition.KeyState.Down ) );
trigger.ConditionsMet += () => AddMarker( t.Item2 );
_inputController.AddTrigger( trigger );
} );
Karena kode sangat 'lokal' dalam ForEach
tidak digunakan kembali di tempat lain, saya dapat menyimpannya di lokasi yang tepat di mana ia relevan. Menguraikan kode sedemikian rupa sehingga kode yang bergantung satu sama lain sangat dikelompokkan bersama membuatnya lebih mudah dibaca menurut pendapat saya.
Alternatif yang mungkin
- Dalam C # Anda bisa menggunakan metode ekstensi sebagai gantinya. Jadi operasikan argumen secara langsung yang Anda berikan ke metode 'satu hal' ini.
- Lihat apakah fungsi ini sebenarnya bukan milik kelas lain.
- Jadikan fungsi statis di kelas statis . Ini kemungkinan besar adalah pendekatan yang paling tepat, seperti juga tercermin dalam API umum yang Anda tuju.
bool arrayContainsSomestring = new List<string>(stringArray).Contains("somestring");
ketika semua yang saya pedulikan adalah bahwa informasi tertentu dan metode ekstensi LINQ tidak tersedia. Berfungsi dengan baik, dan pas di dalamif()
kondisi tanpa harus melompat melalui lingkaran. Tentu saja, Anda ingin bahasa yang dikumpulkan sampah jika Anda menulis kode seperti itu.