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 , ViewsControllers 에서 책임을 합리적으로 분할하는 시스템에 대해 용어를 사용하는 것이 더 실용적인 시점까지는 상호 의존적입니까?
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.