MVC가 "문제의 분리"인 경우 왜 면도기 구문이 도입 되었습니까?


22

내 질문은 MVC 디자인 패턴 및 Microsoft가 도입 한 면도기 구문과 관련이 있습니다.

MVC 디자인 패턴을 배우는 동안 아이디어가 분리의 우려 라는 원칙에 기반을 둔다는 말을 들었습니다 .

그러나 Razor Syntax를 사용하면 뷰 에서 C #을 직접 사용할 수 있습니다.

우려의 교차점이 아닌가?


7
ASP.NET MVC는 실제로 MVC 디자인 패턴을 구현하지는 않습니다. MVC는 ASP.NET MVC에서는 그렇지 않은 변경 사항에 대해 뷰에서 모델을 관찰하도록 지시합니다.
— Benjamin Gruenbaum

11
뷰에 대한 생각 방식을 변경 한 경우에도 도움이 될 수 있습니다. 뷰 는 클라이언트 측 코드 가 아닙니다 . 처리 될 때 클라이언트 측 HTML을 생성하는 서버 측 템플릿입니다. 그리고 서버 측 코드로서 C # 코드가 있다는 것은 완벽하게 허용됩니다.
— Eric King

6
@EricKing은 임의의 코드를 허용하는 템플릿 시스템이 항상 최소 저항 경로를 통해 나쁜 디자인, 끔찍한 레이어 위반 및 유지 관리 불가능 성을 초래하는 부분을 제외하고. 불행히도, 모든 공동체가 스스로 배워야하는 교훈 인 것 같습니다.
— 홉스

12
@hobbs 와우, 알았어. 내 경험이 아닙니다. 물론 항상 그런 것은 아니며, 물론 프로그래머에게는 전문적인 책임이 필요합니다. 나는 도구를 비난하지 않습니다.
— Eric King

7
@BenjaminGruenbaum 요즘은 모든 "MVC"프레임 워크가 상호 의존성을 관리하는 방식이 다르지 않습니까? The One And Only True MVC 스타일에 대해 이야기하는 것이 더 이상 생산적이지 않지만 Models , Views 및 Controllers 에서 책임을 합리적으로 분할하는 시스템에 대해 용어를 사용하는 것이 더 실용적인 시점까지는 상호 의존적입니까?
— Alex

답변:


66

당신은 우려의 분리와 면도기 구문을 혼동하고 있습니다.

우려의 분리는 코드를 구성하는 방법과 관련이 있습니다.

뷰에서 C #을 사용할 수 있다고해서이를 막을 수는 없습니다. 관심사 분리와 는 아무런 관련 이 없습니다 .

물론, 문제의 분리를 따르지 않도록 뷰에서 코드를 구성 할 수 있지만 표시 목적으로 만 사용되는 C # 코드는 어떻습니까? 그 곳은 어디입니까?


1
그러나 C #은 서버 측 언어입니까?
— John Strowsky

6
@ 존-그래서? 표시 할 날짜 형식을 지정해야하는 경우 (및 표시는 항상 클라이언트 측을 의미 함) 어디에서 형식을 지정 하시겠습니까? 모델? 컨트롤러? 둘 다. 당신은보기에서 그렇게 할 것입니다.
— Oded

16
@John-날짜가 DB에 저장되어 모델 / 컨트롤러를 통해 뷰로 전달합니다. HTML에서 거기에 필요하므로 C #으로 직접 형식을 지정하는 대신 어떻게 든 형식을 JS로 출력합니까? 왜? 왜 더 나은가요? 아니면 어떻게 접근 방식이 더 많은 관심사를 분리합니까?
— Oded

25
@ NPSF3000-언어가 "서버 측"또는 "클라이언트 측"이 아닙니다. 그것은 아키텍처 분리이며 아마도 언어 구현 중 하나입니다 (JavaScript는 서버 측 또는 클라이언트 측 언어입니다-node.js를 기억하십시오).
— 오디드

14
@FreeAsInBeer-이것은 클라이언트 측에 속하는 일종의 논리입니다. 프랑스의 누군가는 미국의 누군가와 다른 형식 (날짜 및 통화 / 숫자)을보고 싶어 할 것입니다. 클라이언트는 이것이 어떻게 표시되어야하는지 가장 잘 알고있을 것입니다. 이것은 프리젠 테이션 로직이며 뷰에 속합니다.
— 오디드

35

질문에 직접 대답하기보다는 질문에 대한 가정에 대한 답변입니다. 즉, Razor가 MVC 용으로 구축되었다는 가정은 올바르지 않습니다. ASP.NET 팀에서 Microsoft에서 일하며 이에 대한 직접적인 지식이 있습니다.

Razor는 MVC의 뷰 엔진으로 시작하지 않았습니다. 이것은 ASP.NET Web Pages 용으로 만들어졌으며 아마도 스펙트럼의 가장 덜 분리 된 측면으로 갈 수있는 한 가능할 것입니다. 이것은 ASP.NET Web Forms / Classic ASP에 대한 현대적인 대안으로, 물론 다른 많은 유사한 서버 프로그래밍 프레임 워크로 만들어졌습니다. Razor의 아이디어는 HTML (마크 업)과 C # (코드) 사이를 거의 매끄럽게 전환하는 것이 었습니다.

나중에 나 자신을 포함하는 팀은 Razor 구문이 같은 팀이 작성한 MVC의 뷰 엔진을 위해 많은 의미가 있다고 결정했습니다.

Razor가 ASP.NET MVC에서 관심사 분리 개념을 활성화, 방해, 개선 또는 변경하는지 여부에 대해서는 Oded의 대답 이 중요 합니다.


2
예, 코멘트없이 공감하십시오. 나는 원래의 질문에서 만들어진 가정에 의문을 가지고 있음을 분명히하기 위해 대답을 수정했습니다. 내가 알다시피, 질문은 잘못된 전제를 가지고 있기 때문에 직접 대답 할 수 없습니다.
— Eilon

호기심으로 ASP MVC에 다른 템플릿 엔진이 고려 되었습니까?
— NWard

2
@NWard 당시에는 ASP.NET MVC를위한 많은 타사 뷰 엔진이 있었지만 너무 강력하게 고려하지는 않았습니다. 우리는 Razor가 이해하기 쉬우 며 (HTML은 HTML, C #은 C # 임) ASP.NET Web Pages 프로젝트를 통해 더 잘 이해되었다고 생각했습니다.
— Eilon

1
@Alex oh Razor의 모든 것을 인정할 수는 없지만 귀하의 의견에 감사드립니다!
— Eilon

1
@ateri 잠시 후 답변 왼쪽 상단에 큰 숫자가 표시됩니다.
— Mark Hurd

9

"기술 분리"와 "문제 분리"를 혼동하고 있습니다. MVC의 "View"부분의 기본 개념은 "View"의 코드가 데이터 액세스 나 강력한 로직을 직접 수행하지 않고 각각 "Model"및 "Controller"부분에 남겨진다는 것입니다. "Controller"는 데이터를 변환하고 필요한 로직을 수행 한 후 올바른 "View"로 라우팅합니다. 뷰는 데이터 변환도 수행 할 수 있지만 위에서 언급 한 날짜 변환과 같이 순전히 외관을 유지하는 경향이 있습니다.


이것은 이전 답변에서 제시되고 설명 된 점, 특히 이것에
— gnat

4
+1 간결하고 명확한 방법으로 이전 답변과는 다른 설명에 중점을 둡니다.
— Alex

@gnat 나는 그의 혼란이 어디에 있는지 명확하게하고 우려 분리 원칙이 MVC 디자인 패턴에 어떻게 적용되는지 신속하게 설명하고 싶었다. 아마도 "문제 분리"가 무엇을 의미하는지 더 많은 시간을 보냈어야합니까?
— whoisthemachine

0

나는 완벽한 Don't do it예를 생각할 수 있습니다 .

ProductController가 있다고 가정 해 봅시다.

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

면도기로 우리는 대안이 있습니다

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

그리고 우리의 관점에서 :

@model IEnumerable<Product> 

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

두 번째 솔루션이 너무 잘못되었다는 것이 분명합니다. 이와 같은 일을하는 경우 면도기를 비난하지 말고 스스로를 비난하십시오.

잊지 마세요 : 뷰에서 C #을 사용할 수 있다는 것은 면도기 기능이 아니며 ASP.NET 뷰에서도 가능했습니다. 면도기를 사용하면 조금 더 간단합니다.

더 많은 레일을 가진 템플릿 엔진을 찾고 있다면 Super simple view 엔진으로 nancy.fx를 살펴보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.