Jika MVC adalah "Pemisahan Kekhawatiran" maka mengapa Razor Syntax diperkenalkan?

22

Pertanyaan saya terkait dengan pola desain MVC dan Sintaks Razor yang diperkenalkan oleh Microsoft.

Saat mempelajari pola desain MVC saya diberi tahu bahwa ide tersebut didasarkan pada prinsip yang dikenal sebagai Separation of Concerns .

Tapi Razor Syntax memungkinkan kita untuk menggunakan C # dalam Views secara langsung.

Bukankah ini persimpangan keprihatinan?

John Strowsky
sumber
7
Perlu disebutkan bahwa ASP.NET MVC tidak benar-benar menerapkan pola desain MVC. MVC menentukan bahwa model diamati oleh pandangan untuk perubahan yang jelas tidak terjadi di ASP.NET MVC.
Benjamin Gruenbaum
11
Mungkin juga membantu jika Anda mengubah cara Anda berpikir tentang Tampilan. Tampilan bukan kode sisi klien. Mereka adalah template sisi server yang, ketika diproses, menghasilkan html sisi klien. Dan sebagai kode sisi server, dapat diterima bahwa ada kode C # di sana.
Eric King
6
@EricKing kecuali untuk bagian di mana sistem templating yang memungkinkan kode arbitrer selalu mengarah, melalui jalur dengan resistensi paling rendah, ke desain yang buruk, pelanggaran layering yang mengerikan, dan kemampuan yang tidak dapat dipelihara. Sayangnya, ini tampaknya menjadi pelajaran yang harus dipelajari setiap komunitas dengan caranya sendiri.
hobbs
12
@obb Wow, ok. Tidak dalam pengalaman saya. Tentu saja tidak selalu, dan (tentu saja) ada beberapa tanggung jawab profesional yang diperlukan oleh programmer. Saya tidak menyalahkan alatnya.
Eric King
7
@BenjaminGruenbaum Tidak seperti setiap "MVC" -gambar hari ini berbeda dalam bagaimana mereka mengelola saling ketergantungan? Sampai pada titik di mana tidak lagi produktif untuk membicarakan The One And Only True MVC-Style, tetapi di mana akan lebih pragmatis untuk menggunakan istilah untuk sistem apa pun yang secara wajar memisah-misahkan tanggung jawab dalam Model , Tampilan , dan Pengontrol namun keduanya saling tergantung?
Alex

Jawaban:

66

Anda menggabungkan sintaks Razor dengan pemisahan kekhawatiran.

Pemisahan masalah berkaitan dengan bagaimana Anda menyusun kode Anda.

Mampu menggunakan C # dalam tampilan tidak mencegah hal itu. Itu tidak ada hubungannya dengan pemisahan keprihatinan seperti itu.

Tentu, Anda dapat menyusun kode dalam pandangan Anda untuk tidak mematuhi pemisahan masalah, tetapi bagaimana dengan kode C # yang digunakan untuk tujuan tampilan saja? Di mana itu akan tinggal?

Oded
sumber
1
Tetapi C # adalah bahasa sisi server?
John Strowsky
6
@ John - jadi? Jika Anda perlu memformat tanggal untuk tampilan (dan tampilan berarti sisi klien, selalu), di mana Anda akan memformatnya? Model? Pengontrolnya? Tidak juga. Anda akan melakukannya dalam tampilan.
Oded
16
@ John - jadi, tanggal Anda disimpan dalam DB, Anda meneruskannya melalui model / controller ke tampilan Anda. Anda perlu di sana dalam HTML, jadi Anda akan mengeluarkannya entah bagaimana ke format JS, daripada langsung memformat dengan C #? Mengapa? Kenapa itu lebih baik? Atau lebih tepatnya, bagaimana pendekatan itu lebih dari pemisahan keprihatinan?
Oded
25
@ NPSF3000 - bahasa bukan "sisi server" atau "sisi klien". Itu pemisahan arsitektur - dan mungkin salah satu implementasi bahasa (JavaScript adalah sisi server atau bahasa sisi klien - ingat node.js).
Oded
14
@FreeAsInBeer - ini adalah jenis logika yang dimiliki oleh pihak klien - seseorang di Perancis ingin melihat tanggal (dan mata uang / angka) yang diformat berbeda dengan seseorang di AS. Klien akan "tahu" paling baik bagaimana ini harus ditampilkan. Ini adalah logika presentasi , dan karenanya termasuk dalam tampilan.
Oded
35

Daripada langsung menjawab pertanyaan, tanggapan saya justru mempertanyakan asumsi yang dibuat dalam pertanyaan. Artinya, asumsi bahwa Razor dibangun untuk MVC tidak benar. Saya bekerja di Microsoft di tim ASP.NET dan memiliki pengetahuan tangan pertama tentang ini.

Razor tidak mulai sebagai mesin tampilan untuk MVC. Itu dibuat untuk ASP.NET Web Pages , yang mungkin sejauh yang Anda bisa pergi ke sisi spektrum yang paling terpisah. Itu dibuat sebagai alternatif modern untuk ASP.NET Web Forms / Classic ASP dan tentu saja banyak kerangka kerja pemrograman server serupa lainnya. Gagasan Razor adalah untuk membuat transisi yang hampir mulus antara HTML (markup) dan C # (kode).

Baru kemudian tim (termasuk saya sendiri) memutuskan bahwa sintaks Razor akan membuat banyak akal demi mesin tampilan untuk MVC, yang sedang ditulis oleh tim yang sama.

Mengenai apakah Razor mengaktifkan, menghambat, meningkatkan, atau mengubah konsep pemisahan kekhawatiran di ASP.NET MVC, jawaban Oded tepat.

Eilon
sumber
2
Yay, downvote tanpa komentar. Saya mengubah jawaban saya untuk memperjelas bahwa saya mempertanyakan asumsi yang dibuat dalam pertanyaan awal. Seperti yang saya lihat, pertanyaannya tidak langsung dijawab karena memiliki premis yang tidak valid.
Eilon
Karena penasaran, apakah ada mesin templating lain yang dipertimbangkan untuk ASP MVC?
NWard
2
@NWard Ada sejumlah mesin pandangan pihak ke-3 untuk ASP.NET MVC pada saat itu, tetapi kami tidak menganggapnya terlalu kuat. Kami merasa bahwa Razor lebih mudah dipahami (HTML adalah HTML, C # adalah C #) dan juga lebih baik dengan proyek ASP.NET Web Pages.
Eilon
1
@Alex oh saya tentu saja tidak bisa menghargai semua Razor, tapi saya menghargai komentar Anda!
Eilon
1
@ateri Setelah beberapa saat, itu adalah angka besar di kiri atas jawabannya.
Mark Hurd
9

Anda membingungkan "pemisahan teknologi" dengan "pemisahan masalah". Gagasan dasar di balik bagian "Tampilan" MVC adalah bahwa kode dalam "Tampilan" tidak melakukan akses data atau logika berat secara langsung, melainkan diserahkan kepada masing-masing bagian "Model" dan "Kontroler". "Controller" mentransformasikan data, melakukan semua logika yang diperlukan, dan mengarahkannya ke "View" yang benar. Pandangan juga dapat melakukan transformasi data, tetapi saya cenderung menjaganya agar tetap murni kosmetik, seperti transformasi tanggal yang disebutkan di atas.

wahana mesin
sumber
ini tampaknya tidak menawarkan sesuatu yang substansial atas poin yang dibuat dan dijelaskan dalam jawaban sebelumnya, terutama yang ini
Agas
4
+1 Diformulasikan secara ringkas dan jelas dan dengan fokus penjelasan yang berbeda dari jawaban sebelumnya.
Alex
@gnat Saya hanya ingin memperjelas di mana letak kebingungannya dan kemudian dengan cepat menjelaskan bagaimana prinsip pemisahan perhatian berlaku pada pola desain MVC. Mungkin saya seharusnya menghabiskan lebih banyak waktu untuk arti "pemisahan kepedulian"?
whoisthemachine
0

Saya bisa memikirkan Don't do itcontoh yang sempurna .

Katakanlah kita memiliki ProductController:

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.Where(x => x.Discontinued).ToList();
        return new ViewResult(products);
    }
}

Dengan pisau cukur kami punya alternatif

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.ToList();
        return new ViewResult(products);
    }
}

dan dalam pandangan kami:

@model IEnumerable<Product> 

@foreach (var item in Model.Where(x => x.Discontinued)) {
    ....
}

Saya pikir cukup jelas bahwa solusi kedua terasa sangat salah. Jika Anda melakukan sesuatu seperti ini, jangan salahkan pisau cukur - salahkan diri Anda.

Dan jangan lupa: Mampu menggunakan C # dalam pandangan bukanlah fitur pisau cukur, itu mungkin dengan tampilan ASP.NET juga. Dengan pisau cukur itu hanya sedikit lebih sederhana.

Jika Anda mencari mesin templat yang lebih rel seperti Anda harus melihat nancy.fx dengan mesin tampilan super sederhana.

Jürgen Steinblock
sumber