Saya memiliki daftar turun bawah yang menampilkan nilai dari tabel ke pengguna akhir. Saya ingin agar nilai-nilai ini diurutkan berdasarkan abjad.
Menurut desain MVC yang tepat, pada lapisan apa saya harus menempatkan logika penyortiran saya: model, tampilan, atau pengontrol?
EDIT : Menanggapi pertanyaan LarsH, "Apakah maksud Anda kode yang menentukan jenis pesanan apa yang diinginkan? Atau kode yang melakukan jenis itu?", Saya awalnya merujuk pada kode yang menentukan jenis urutan apa yang diinginkan.
asp.net-mvc
model-view-controller
Ryan Kohn
sumber
sumber
Jawaban:
(Catatan: kutipan dan kutipan ini diambil dari jawaban @ dasblinkenlight , tetapi kami tidak setuju dengan interpretasi kami tentang hal itu. Baca postingnya dan buat keputusan sendiri).
Menurut deskripsi MVC ,
Logika pengurutan (mis., Algoritma sortir komparator / pengurutan) termasuk dalam model karena berisi aturan bisnis dan data negara. Karena mengubah cara data model diurutkan jatuh tepat ke dalam kategori "ubah presentasi tampilan model", controller bertanggung jawab untuk "melakukan penyortiran" dengan memanggil metode model.changeSortedState ().
sumber
public void Sort(bool sortByDescending = false)
, di mana jika false itu diurutkan dengan naik. Atau hanya memiliki dua metode penyortiran yang berbeda jika logikanya sangat berbeda.Siapa yang mengendalikan urutan pengurutan?
(Dari Wikipedia )
1) Urutan alami dalam data itu sendiri:
Urutan adalah bagian dari Model, jadi harus pergi ke sana. Tarik mentah "semua data" akan mengembalikan data dalam urutan yang diurutkan, dan tidak ada antarmuka untuk memilih urutan.
2) Pengguna harus mengontrol cara mereka melihat data:
Tampilan akan menyediakan antarmuka (seperti panah naik / turun) yang berinteraksi dengan Controller, dan Model memahami data dengan cukup baik untuk melakukan pengurutan yang diminta pada data. Namun, tarikan data mentah tidak harus harus diurutkan, tidak seperti dalam (1).
Dalam kedua kasus tersebut,
Tampilan tidak mengerti bahwa ada semacam hal yang terjadi, selain itu kemampuan untuk menunjukkan arah sortir mana yang telah dipilih. Jangan menaruh logika di sana.
Peringatan kecil
Fungsionalitas penyortiran bisa murni di View, dalam satu keadaan (yang bisa saya pikirkan begitu saja; mungkin ada lebih):
Sortir "bodoh" di mana semua data sudah ada dalam tampilan dan tidak perlu menggunakan pengetahuan domain apa pun untuk melakukan sortir. Perbandingan string atau angka yang sangat sederhana, misalnya. Ini tidak mungkin di, misalnya, hasil pencarian pada halaman web ketika hasilnya cenderung dipecah menjadi beberapa halaman.
sumber
Menurut deskripsi MVC ,
Menurut ini, pengurutan logika termasuk dalam pengontrol, karena mengubah cara data model diurutkan jatuh tepat ke dalam kategori "mengubah tampilan presentasi model".
EDIT: Untuk memperjelas beberapa kesalahpahaman yang disuarakan dalam komentar, "logika penyortiran" bukanlah kode yang melakukan penyortiran; itu adalah kode yang mendefinisikan semacam itu. Logika pengurutan membandingkan masing-masing item satu sama lain untuk menetapkan suatu pesanan (misalnya melalui instance
IComparator<T>
) atau berisi logika yang membangun objek yang akan digunakan untuk pemesanan oleh sistem eksternal (misalnya melalui instance dariIOrderedQueryable<T>
). Logika ini termasuk dalam pengontrol Anda, karena memerlukan pengetahuan yang terkait dengan sisi "bisnis" dari aplikasi Anda. Ini sepenuhnya cukup untuk melakukan pengurutan, tetapi terpisah dari kode yang sebenarnya melakukanItu. Kode yang mengurutkan mungkin dalam pandangan Anda, dalam model Anda, atau bahkan di lapisan kegigihan yang mendukung model Anda (misalnya database SQL Anda).sumber
IComparer<T>
. "Mekanika boilerplate" yang tersisa dari penyortiran, termasuk pengambilan data dari model, tergantung pandangan.{Unknown, Pass, Fail}
. Asumsi lebih lanjut yangUnknown
harus selalu diurutkan terakhir, terlepas dari urutan naik atau turun yang dipilih pengguna. Menempatkan logika ini dalam tampilan akan memberi tahu pandangan Anda terlalu banyak tentang sifat bisnis dari data di dalamcode
bidang. Tampilan seharusnya tidak mengetahuinya: yang diketahui hanyalah bahwa pengguna melakukan isyarat "sort" (mis. Mengklik header); sisanya terserah controller.Bukan dari salah satu di atas. Penyortiran adalah logika bisnis, dan logika bisnis tidak termasuk dalam ketiganya. Tidak setiap bagian kode dalam aplikasi Anda akan menjadi model, tampilan, atau pengontrol.
Apa yang biasanya saya lakukan di aplikasi MVC saya adalah saya memiliki lapisan layanan yang melakukan semua logika bisnis. Metode di lapisan layanan harus memiliki API yang bersih dan sederhana dengan parameter yang dinamai dengan baik. Anda kemudian dapat memanggil metode-metode itu dari pengontrol Anda untuk memanipulasi data dalam model.
Dalam pengertian itu, pengurutan adalah "di controller", tetapi kode itu sendiri yang melakukan pengurutan tidak boleh diimplementasikan di controller, hanya dipanggil dari sana.
sumber
Jelas bukan controller: Ini mengirim pesan untuk dilihat dan dimodelkan tetapi harus melakukan pekerjaan sesedikit mungkin. Jika pengguna dapat mengubah pengurutan bahwa permintaan akan ditangani oleh pengontrol dengan menginformasikan model atau pandangan tentang itu.
Mungkin View jika itu adalah View murni. Jika Aplikasi berfungsi dengan baik tanpa memilah maka penyortiran hanyalah bagian dari representasi dan harus masuk dalam tampilan.
Jika pemesanan merupakan bagian yang tidak dapat dipisahkan dari domain, maka harus dimasukkan dalam model.
sumber
Jadi pilihannya adalah - apakah Anda pikir ini adalah bagian dari logika bisnis domain atau logika presentasi.
Jika Anda menerapkan MVC Model2 yang tepat atau pola MVC klasik, maka saya akan mengatakan bahwa pemesanan data yang disediakan oleh lapisan model harus dipicu oleh permintaan tampilan ke lapisan model. Lihat meminta data yang dipesan, lapisan model menyediakannya.
Tapi, karena Anda menggunakan interpretasi ASP.NET MVC tentang pola MVC, yang sedikit berbeda dari MVC standar Anda - contoh ViewModel harus meminta informasi yang dipesan dari lapisan model (untuk beberapa alasan kerangka ASP.NET berpikir bahwa templat harus disebut "views" dan views harus disebut "viewmodels" .. ini aneh).
sumber
Saya biasanya akan melakukannya di controller untuk tetap sejalan dengan pola sesuai jawaban lainnya. Lihat di bawah untuk alasan.
Saya telah merenungkan ini dan membaca jawaban dan materi terkait dan secara pragmatis saya akan mengatakan itu akan tergantung pada aplikasi Anda misalnya:
Apakah itu aplikasi menengah / besar dan / atau memiliki beberapa UI yang terkait dengannya (yaitu Aplikasi Windows, antarmuka Web, dan antarmuka Telepon).
Jika ini adalah situs web UI tunggal yang didefinisikan dengan baik dan Anda menggunakan sesuatu seperti EF Code First dan Anda tidak memiliki atau tidak memiliki niat untuk membuat lapisan layanan dan berencana untuk menggunakan metode Extension sederhana di luar kotak untuk mencapainya:
Jika sama dengan NAMUN di atas tidak dapat diimplementasikan dengan metode ekstensi di luar kotak.
Untuk menyimpulkan:
Jawaban dogmatis: Lapisan Layanan
Jawaban pragmatis: Biasanya controller
sumber
Saya sarankan menyortir data dari tabel-data yang cukup kecil untuk berguna dalam daftar dropdown-harus berasal dari DB yang sudah diurutkan melalui kueri. Bagi saya, itu menjadikan model tempat penerapan semacam itu.
Jika Anda bertekad untuk melakukan pengurutan dengan tangan, saya pikir ada argumen yang baik untuk menggunakan model atau pengontrol sebagai tempat pilihan Anda untuk logika. Keterbatasan akan menjadi kerangka kerja khusus Anda. Saya lebih suka mengelola data hanya dalam model. Saya menggunakan pengontrol untuk mengawinkan data (model) dan presentasi (tampilan) seperti yang telah saya (sendiri) ajarkan.
sumber
Sementara saya setuju secara prinsip dengan gagasan bahwa pengurutan adalah Logika Bisnis karena dengan memecahnya ke asalnya Anda akan berakhir dengan sesuatu seperti "Klien ingin halaman Produk ditampilkan dengan gambar diurutkan berdasarkan tanggal" maka menjadi jelas bahwa urutan pengurutan untuk data biasanya tidak sewenang-wenang - bahkan jika tidak ada pengurutan karena itu masih merupakan keputusan bisnis karena kelalaian (daftar kosong masih daftar).
TAPI ... Jawaban ini tampaknya tidak memperhitungkan kemajuan teknologi ORM, saya hanya bisa berbicara sehubungan dengan Entity Framework (mari kita hindari argumen tentang apakah ini benar ORM, itu bukan intinya) dari Microsoft sebagai itulah yang saya gunakan, tapi saya yakin ORM lain menawarkan fungsionalitas serupa.
Jika saya membuat tampilan Sangat Diketik untuk kelas Produk menggunakan MS MVC dan Entity Framework dan ada hubungan kunci asing antara tabel Produk dan Gambar (misalnya FK_Product_Image_ProductId) maka saya akan langsung bisa mengurutkan dengan cepat gambar selama tampilan mereka menggunakan sesuatu seperti ini dalam tampilan:
Ada disebutkan tentang lapisan Logika Bisnis, yang saya juga gunakan untuk melakukan 80% dari logika bisnis saya, tapi saya tidak akan menulis fungsi semacam ke dalam lapisan Logika Bisnis saya yang meniru sesuatu yang keluar dari kotak dari Kerangka Entitas.
Saya tidak berpikir ada jawaban yang benar untuk pertanyaan ini, selain mengatakan itu; Anda harus abstrak logika bisnis yang kompleks di mana mungkin tetapi tidak dengan biaya menciptakan kembali roda.
sumber
myList.OrderBy(x => x.CreationDate)
- benar-benar tidak perlu memperkenalkan lapisan tambahan yang tidak perlu hanya untuk melakukan ini. Untuk menambah ini, apa yang akan mereka lakukan jika mereka membutuhkan data halaman dan diurutkan? Minta seluruh tabel, urutkan, lalu simpan yang mereka butuhkan? Seseorang bisa saja meneleponmyList.OrderBy(x => x.Date).Skip((page-1)*pageSize).Take(pageSize)
dan tidak ada data yang tidak perlu diambil.Asumsikan bahwa Anda memiliki situs web MVC, situs web WebForms, dan aplikasi seluler.
Jika Anda ingin menyortir agar konsisten di antara lapisan presentasi ini, maka saya akan mengatakan semacam di luar lapisan presentasi. Layanan akan menjadi kandidat yang baik.
Kalau tidak, saya akan menyimpan logika itu dalam model tampilan. Mengapa? Karena itu akan dapat digunakan kembali dan mudah diuji.
sumber
Dari tiga yang Anda daftarkan, saya akan mengatakan bahwa itu termasuk dalam controller. Saya tidak terlalu suka menempatkan logika semacam ini di controller. Saya biasanya membuat lapisan layanan yang berkomunikasi dengan controller yang akan bertanggung jawab untuk berkomunikasi dengan penyimpanan data dan menangani logika penyortiran. Untuk aplikasi kecil, tidak masalah untuk duduk di controller.
sumber
Ini adalah pertanyaan yang diajukan dengan asp.net dalam pikiran, tetapi karena seseorang memang menyebutkan Rails, saya pikir akan menarik untuk mempertimbangkan masalah dalam konteks itu. Dalam Rails, wajar dan cukup umum untuk melakukan penyortiran bersama dengan pengambilan sebagai tindakan pengontrol, karena kerangka kerja dan ketentuan api ActiveRecord / ActiveQuery untuk itu. Di sisi lain, dimungkinkan untuk menentukan semacam urutan penyortiran khusus untuk item statis dan memasukkannya ke dalam model yang akan digunakan oleh pengontrol, sehingga model tersebut dapat memainkan bagian dalam logika penyortiran meskipun tidak dilakukan. operasi secara langsung. Apa pun itu, dapat dikatakan bahwa menempatkan semacam logika dalam pandangan umumnya tidak disukai.
Saya sedikit geli bahwa beberapa jawaban benar-benar menentang meletakkan semacam itu di controller atau model, dan saya menemukan mereka terlalu bagus untuk seleraku, tapi saya kira itu tergantung pada sifat kerangka kerja yang digunakan dan konvensi biasa yang terkait dengan Itu. Saya juga setuju dengan komentar Bill K bahwa pertama-tama berpisah lebih penting.
sumber