2013-10-27 1 views
15

아마도 이것은 좋은 질문이 아니지만 가능한 한 객관적이고 책임감있게 작성하려고 노력할 것입니다.각도 및 시맨틱 마크 업/우려 분리

저는 Angular.js를 가지고 놀았으며 실제로 좋아했습니다. 그러나 나는 그 철학에 관해 질문이 있습니다. 다음은 컨트롤러 용 Angular 사이트의 코드 스 니펫입니다.

<div ng-controller="TodoCtrl"> 
     <span>{{remaining()}} of {{todos.length}} remaining</span> 
     [ <a href="" ng-click="archive()">archive</a> ] 
     <ul class="unstyled"> 
     <li ng-repeat="todo in todos"> 
      <input type="checkbox" ng-model="todo.done"> 
      <span class="done-{{todo.done}}">{{todo.text}}</span> 
     </li> 
     </ul> 
     <form ng-submit="addTodo()"> 
     <input type="text" ng-model="todoText" size="30" 
       placeholder="add new todo here"> 
     <input class="btn-primary" type="submit" value="add"> 
     </form> 
    </div> 

이것은 기본적으로 HTML에 뿌려 각도 지침을하다 내가 잠재적 susupect 찾을 하나는 이것이다 :. <a href="" ng-click="archive()">archive</a>.

Jeffrey Zeldman이 Designing With Web Standards을 작성했을 때 마크 업 (HTML), 프리젠 테이션 (CSS) 및 상호 작용 (JS)을 유지 관리를 위해 여러 파일로 분리하는 것이 좋습니다.

제 질문은 Angular가 어떻게 위배하지 않는 것입니까? 저는 실제로 그것을 실제로 즐기고 있으며 매우 강력합니다. 그러나 클릭 이벤트를 마크 업에있는 a 요소에 바인딩하는 것과 웹 표준 전 코드에 대한이 흔적을 작성하는 것의 차이점은 무엇입니까?

<a href='#' onClick='showAlert()'>Click here</a> 

<script> 
    var showAlert = function(){ 
     alert('hey'); 
    } 
</script> 

유용한 답변은 프레임 워크 사용에 대한 개인적인 경험 외에도 설명서를 참조 할 수 있습니다.

+1

첫 번째 생각은 jQuery와 의미 론적 마크 업을 사용하여 상태 저장 단일 페이지 응용 프로그램을 작성하고 코드 양, 시간 및 두통을 동일한 응용 프로그램에 각도로 작성된 코드와 비교하는 것입니다 ... 테스트 중입니까? 각도가 훨씬 간단합니다 .... 코드 및 코드 단편화 - 양이 적습니다. 모듈성과 유지 보수성 또는 개선의 용이성 ... 각도가 훨씬 간단합니다. 트레이드 오프는 우려 사항의 결합에 가치가 있습니다. IMO – charlietfl

+2

Youre right, this is not. 그것은 개념적 질문과 같아서 http://programmers.stackexchange.com/에 속해 있습니다. – qodeninja

답변

9

용의자를 찾는 코드 조각부터 시작하여 AngularJS와 일반 HTML 및 Javascript에서 처리되는 방식의 근본적인 차이점부터 살펴 보겠습니다.

는이에 뿌려 각도 지시에 기본적으로 HTML이다 나는 잠재적 susupect 발견이 인 하나 :. <a href="" ng-click="archive()">archive</a>.

<a href="" onclick="archive()">archive</a> 

그러나, 위의 HTML과 AngularJS와 구현 사이의 근본적인 차이가있다 :

이것은 우리가 10 년 전에 쓴 무언가에 굉장히 비슷합니다. AngularJS의 경우, archive 함수는 우리가 제어하는 ​​범위에 있으며 컨트롤러를 사용하여 조작 할 수 있습니다. 원시 JS 예제에서는 archive이 전역 네임 스페이스에 있어야합니다 (이는 여러 가지 이유로 좋지 않습니다).

그러나 우리는 여전히 onclick 이벤트 바인딩이 의도 한 바를 볼 수 있습니다. 이는 선언적으로 동작을 뷰에 구현하고 JS가 구현 세부 사항을 처리하도록하는 것을 의미합니다. AngularJS가 수행하는 은 일반 HTML에서는 불가능했던 방식으로 뷰의 차이 범위/컨텍스트를 체계적으로 구성 할 수있는 방법을 제공합니다.

예 AngularJS는 프레젠테이션과 바인딩 문제를 뷰로 더 이동시켜 HTML을 확장합니다. 희소식은 우리가 HTML6을 통해 그 방향으로 가고 있다는 것입니다. 여기에 몇 가지 선택 인용 http://html6spec.com/에서있다 :

당신이 그것을 최대를 표시 할 방법이 무엇인가를 표시 할 수있는 상상해보십시오. 상상해보십시오 <div id="wrapper"> to <wrapper> ...

웹은 거대한 앱 스토어로 이동하고 있으며이를 포용해야합니다. 우리가 사용하는 마크 업이 우리에게 작용해서는 안되며, 우리를 위해 작동해야합니다. 이 사양은이를 수행하는 것입니다. 드디어 표준을 벗어나 개발자들에게 코드 작성의 자유를 부여하기 위해 우리는 매크로를 더 의미 있고 깨끗하며 사람이 읽을 수있는 마크 업으로 가져 오시기 바랍니다.

AngularJS는 HTML6의 모든 장점을 제공하지만, 오늘 우리는이를 사용할 수 있습니다. 지난 15 년 동안 웹 사용 방식이 크게 바뀌었고 우리의 도구가 아직 많이 뒤떨어져 있습니다. 운 좋게도 미래는 빛과 희망의 등대이며 AngularJS는 미래를 현재로 되돌립니다.

+0

이 답변은 유익하고 시적입니다. – nickcoxdotme

+3

http://html6spec.com/을 HTML6의 정확한 표시로 사용해서는 안됩니다. 그것은 단지 한 사람이되기를 원하는 것입니다. 저자는 그것이 공식적인 스펙이 될 것이라고 예견하지 않는다. –

+0

'archive'은 완전히 의미가 없습니다. 인라인 자바 스크립트, 정말? 누가 그 생각을 좋은 생각이라고 생각하니 ?? 관심의 분리는 data- * 속성 때문에 프론트 엔드에서 마술처럼 사라지지 않습니다. – qodeninja

1

저는 대형 프로젝트에서 지난 2 년 동안 Knockout.js (데이터 바인딩 개념과 관련된 각도와 매우 흡사합니다)를 사용했습니다. 전체 함수 구현 대신 마크 업에서 일부 함수 이름 만 갖는 주된 이점은 마크 업을 변경하지 않고 구현을 쉽게 변경할 수 있다는 것입니다. 특히 우리의 경우처럼 마크 업이 완전히 제어되지 않는 경우.

시각적 요구 사항에 맞게 디자이너가 마크 업을 변경했지만 데이터 바인딩 특성이 엉망이 아니라고 말했습니다. 물론, 마크 업을 너무 많이 변경하여 데이터 바인딩 속성을 변경해야했지만 대부분 태그를 다른 태그로 이동한다는 의미였습니다. 구현은 변경되지 않았습니다.

3

꽤 많은 interresting 관측과 질문, @mortalapeman의 좋은 대답.

저는 html의 기능을 추가하고 싶습니다. 그리고 그것이해야 할 일에 대한 우리의 기대가 변하고 있습니다. 우리는 우리의 행동을 문서 (HTML)에서 완전히 없애고 오히려 문서를 오염시키지 않으면 서 문서에 연결하도록 코드를 설정하는 법을 배웠습니다.

Angular에서는 html의 작업이 단순히 문서가 아니라 응용 프로그램의 프리젠 테이션 계층이됩니다.이 응용 프로그램은 훨씬 더 큰 작업입니다. 그리고이 작업을 채우기 위해 Angular (및 유사한 프레임 워크)를 사용하면 mortalapeman이 지적한대로 우리의 데이터와 동작을 선언적 방식으로 지적하고 양질의 범위와 테스트를 가능하게하는 동시에 양방향 바인딩을 선언적 방식으로 수행 할 수 있습니다.

사실, 이제 생각해 보면 html이 순수한 문서 여야한다는 입장을 유지하는 것이 실제로 어리석은 일이지만 버튼과 다른 컨트롤이 포함되어있어 문서. 어쩌면 그것은 나뿐이지만 역설적 인 것을 알 수 있습니다. 컨트롤을 조작 할 때 어떤 액션이 트리거되어야 하는지를 선언한다는 것이 나에게 완벽하게 이해됩니다.

3

저는 최근에 Angular를 연구 중이었고 똑같은 생각을 가지고 있었는데, 이것이 우려의 분리를 위반하지 않았습니까? 그들이 사이트에서 제공하는 예제는 "우려 사항을 분리합니다!" 지난 10 년 동안 MVVM 및 MVC에 관여 한 후에 Angular가 Cold Fusion으로 돌아가는 단계라고 생각합니다. 콜드 퓨전과 앵귤러가 강하지 않다는 것은 아닙니다. 그들은 나쁜 디자인을 원하고 있습니다.

모든 SDLC 연구에 따르면 총 소프트웨어 비용의 50-60 %가 개발 단계가 아니라 유지 관리 단계에 있습니다. 그러나 대부분의 개발자들은 (만기 날짜로 인해) 개발자는 단지 그것을 밖으로 가져와야한다고 생각하고 그들의 신용에 대해, 그들은 그렇게합니다! 그러나 프로젝트가 끝나고 개발자가 떠나고 나머지는이 코드 기반을 지원하는 방법에 대해 궁금해합니다.

오랫동안 OOP 및 OOD에 대해 알고 있었고 최근에는 JQuery와 같은 확장 기능으로 Javascript를 가져 오는 시도를 보았습니다. Javascript가 실제로 OOD 언어가되고 그 모든 확장이 진정으로 이루어지지 않을 때까지 말입니다. "gloabal 변수가 나쁜"위의 주석은 좋은 설명이지만 강력한 형식의 언어에서는 결코 신경 쓰지 않습니다.이러한 유형의 문제가 발생하는 유일한 경우는 프레임 워크가 즉시 지원합니다. 강력하게 형식화 된 언어는 필요한 경우 전역 변수를 가질 수 있지만 범위 지정은 해당 언어에서 왕이되며 가장 먼저 배운 것 중 하나입니다.

필자의 경험으로는 프로그래머가 먼저 1) 빨리 좋은 기술을 구성하는 패턴을 인식하기 전에 작업을 끝내야한다는 것입니다. 2) 모든 주요 기관에는 심각한 재인식이 필요한 많은 코드가 있습니다. 3) 확장 성 문제는 수년 전까지는 나타나지 않습니다. 4) 다시 도구를 사용하려는 노력은 대단합니다! 이 모든 것이 취업 보장에 좋은 소식이지만, 동시에 처음부터 제대로하지 않는 이유는 무엇입니까?

JQuery, Javascript 및 Angular도 위치가 있지만, 이들을 인식하지 못하는 나쁜 디자인을 장려하는 프레임 워크이기도합니다. 모든 프로그래밍에서 가장 중요한 단일 패턴이 이벤트 핸들러를 작성하고 이벤트를 작성하는 기능에서 볼 수있는 "옵저버 패턴"이라는 것을 발견했습니다. 디커플링은 목록에서 매우 높게됩니다. 이벤트 및 이벤트 처리 기회에 큰 코드가있는 경우 올바른 방향으로 향하게됩니다. 코드를 재사용하고 일을 반복하지 않는 것에 대해 엄격한 경우 잘 수행하고 있습니다. 마지막으로 열정으로 다시 생각해보고 인터페이스 기반 프로그래밍 기술의 힘을 잘 이해한다면 잘하고 있습니다. 오 예 그렇습니다. 당신이 의존성 주입이 무엇인지 아는 경우, 당신은 프로그래머 군대의 5 성급 장군입니다. 3 월에, 좋은 군인들!

+0

2014 년에 나는 여전히 자바 좋아하지 않아. 그 이후로 나는 팬이되었다. Angular 주석까지는 훌륭한 프로그램 작성자가 바로 반 패턴을보고 가능하면 가능한 한 많이 제거합니다. Angal은 React와 Aurelia가 멋지게 가열되는 것처럼 잘됩니다. –

관련 문제