정적 언어에 익숙한 프로그래머가 Javascript 툴링 부족에 대처하는 방법


28

나는 내 경력의 대부분을 위해 컴파일 된 언어, 특히 Java로 거의 독점적으로 프로그래밍했다. Java에서 내가 가장 좋아하는 것 중 하나는 Eclipse와 같은 도구를 사용할 때 생산성을 높이고 실제로 작성해야하는 코드가 거의 없다는 것입니다.

당신은 할 수 있습니다 :

  • 메소드와 클래스를 쉽고 자동으로 리팩토링
  • 메소드가 호출되거나 상수가 사용 된 모든 위치를 즉시 봅니다 (오픈 콜 계층 / 참조 표시)
  • 정적 입력은 코드 완성을 사용하여 객체에서 사용 가능한 모든 매개 변수 / 기능을 표시 할 수 있음을 의미합니다.
  • 함수 / 멤버 / 클래스 이름을 Control- 클릭하여 정의로 바로 이동

이 모든 시설들은 IDE가 나의 가장 친한 친구 인 것처럼 느끼게합니다. Java 코드를 작성하고 특히 다른 사람들의 프로그램을 이해하는 것이 훨씬 쉬워졌습니다.

그러나 점점 더 많은 자바 스크립트를 사용해야하는데 지금까지 제 경험은 상당히 부정적이었습니다.

특히:

  • 함수의 진입 점을 즉시 찾을 수있는 방법이 없습니다 (일반 텍스트 검색 이외의 경우, 2 개 또는 3 개의 시작 위치를 잊어 버린 후 호출 계층을 추가로 메소드에 대한 후속 검색으로 이어질 수 있음)

  • 매개 변수는 실제로 프로그램을 실행하고 함수가 호출 된 지점으로 이동하고 console.logs를 사용하여 모든 특성을 출력하는 것을 제외하고 해당 매개 변수에서 사용 가능한 특성 및 함수를 알 수있는 방법없이 함수에 전달됩니다. 유효한)

  • 익명 함수를 콜백으로 자주 사용하므로 혼동되는 코드 경로 스파게티가 생겨 빠르게 탐색 할 수 없습니다.

  • 그리고 JSLint는 런타임 전에 약간의 오류를 포착하지만 브라우저에서 직접 코드 아래에 빨간색 물결 모양의 선을 갖는 것만 큼 편리하지는 않습니다.

결론은 항상 전체 프로그램을 머릿속에 두어야한다는 것입니다. 이것은 복잡한 프로그램 작성을위한인지 부하를 크게 증가시킵니다. 그리고이 모든 걱정거리는 실제 창의력과 문제 해결을위한 공간을 적게 차지합니다.

물론 전체 공식 클래스 정의를 작성하는 대신 객체를 함께 던지는 것이 더 빠릅니다. 그러나 프로그램이 약간 쉽고 빠르게 작성 될 수 있지만 내 경험상 프로그램을 읽고 디버깅하기가 훨씬 어렵습니다.

제 질문은 다른 프로그래머들이 어떻게 이러한 문제에 대처하는 것입니까? Javascript는 분명히 인기가 높아지고 있으며 필자가 읽은 블로그는 이러한 문제에 대한 해결책을 필사적으로 찾으려고하지 않고 생산적인 사람들이 어떻게 사용하고 있는지에 관한 것입니다.

GWT를 사용하면 Java에서 Javascript 환경에 대한 코드를 대신 작성할 수 있지만 예상만큼 널리 사용되지는 않습니다. 사람들은 실제로 복잡한 프로그램에 자바 스크립트를 선호하는 것 같습니다.

내가 무엇을 놓치고 있습니까?


8
JS로 어려움을 겪고있는 모든 Java 개발자에게 조언은 C 기반 구문이없는 다른 언어를 배우는 것입니다. JS로 돌아올 때 구문 유사성을 극복하는 데 도움이되며 모든 코드와 방법을 작성하는 하나의 진정한 방법으로 물건을 보는 것이 아니라 언어 디자인의 트레이드 오프 측면에서 물건을 살펴 보는 데 도움이 될 수 있습니다 다른 사람들은 모두 잘못 이해합니다. UI 프레임 워크를 작성하려는 아이디어가 있다면, CTO에 대해 설명하기가 쉽지 않은 클래스 클래스의 가비지 조각을 사용하여 JavaScript를 익히십시오.
Erik Reppen

5
2 년 전 저를 막으려 고했던 사람. 최근에 Java를 더 강하게 쳤기 때문에 조금 더 도움을 주려고 노력할 것입니다. IDE? Jetbrains Webstorm을 확인하십시오 (나는 여전히 Scite를 주로 사용하지만 WS는 나쁘지 않습니다). 클라이언트 측 웹의 경우 Chrome의 개발 도구는 디버그에서 당신을 덮는 데 꽤 잘 작동하며 스 니펫을 작성할 때 자동 완성을 실제로 수행합니다. 콘솔의 코드. 또한 OOP에 대해 많은 시간을 투자하십시오. 인간의 가독성을 대신하는 IMO, 비 선택적 클래스 및 IDE는 많은 Java에서 OOP의 요점을 완전히 살해했습니다.
Erik Reppen 17:32에

2
네 아픔이 느껴져. 자바 스크립트로 드롭 다운하는 것은 클라이언트 측에서 어셈블리 언어로 드롭 다운하는 웹 버전입니다. 확실히 재미있을 수 있지만 툴셋이 약하고 추가 작업을 수행하면 생산성이 확실히 떨어집니다. 그래도 인생은 프로그래밍입니다. 모든 것이 최고 수준의 추상화에서 수행되는 것은 아닙니다. :-)
Brian Knoblauch

2
@ErikReppen Java 개발자로 시작했지만 Ruby, Delphi, C ++, C #, Prolog, PHP, bash로 프로그래밍 된 Obj-C에 능숙하며 여전히 자바 스크립트를 읽고 관리하는 것이 최악입니다.
Sulthan

2
TypeScript를 살펴보십시오. 일단 사용하기 시작하면 클라이언트 측 코딩이 훨씬 생산적이고 즐겁습니다. 적절한 인텔리전스 및 초기 컴파일러 경고를 이길 수 없습니다.
Evgeni

답변:


22

Javascript와 같은 동적 언어에서는 IDE 기반 기능을 사용할 수 없습니다 *. 그들 없이는 배워야합니다. 더 나은 디자인으로 도구 지원을 교체해야합니다.

손으로 또는 requirejs 와 같은 도구 로 모듈 패턴을 사용하십시오 . 쉽게 추론 할 수 있도록 모듈을 작게 유지하십시오.

많은 유형을 정의하지 마십시오 . 호출 시점에 가까운 익명의 개체를 사용하십시오. 그런 다음 발신자와 수신자를보고 무슨 일이 일어나고 있는지 알 수 있습니다.

코드와 DOM의 결합을 피하십시오-코드에서 수행하는 DOM 조작의 양을 제한하려고 노력하십시오. 선택기 또는 jQuery 컬렉션을 전달할 수 있다면 코드가 페이지 구조에 대해 알도록하는 대신 수행하십시오.

* 인기있는 라이브러리를 사용하는 경우 가짜 자동 완성 기능을 사용할 수 있지만 "이 객체의 속성"보다는 "모든 jquery 메소드 표시"와 비슷합니다. 입력을 저장하지만 정확성을 보장하지는 않습니다.


툴링 부족을 처리하는 방법에 대한 건설적인 조언을 위해 이것을 받아들입니다.
funkybro

3
"그들없이하는 법을 배워야합니다." 또는 스크랩하거나 자바 스크립트를 생성하고 적절한 도구가있는 고급 언어를 사용하십시오.
Den

@Den : 고급 도구를 사용하여 고급 언어에 대한 제안이 있습니까? 내 경험상, 고급 도구는 대중적인 언어를 위해 만들어졌습니다. Javascript로 컴파일되는 고급 언어 중 어떤 도구가 그러한 도구를 사용할만큼 인기가 있습니까?
Sean McMillan

1
@SeanMcMillan : 일부 .NET (C # / F #) 예제는 jsil.org , projects.nikhilk.net/ScriptSharp , sharpkit.net , websharper.com
Den

1
@SeanMcMillan Java도 GWT developers.google.com/web-toolkit
funkybro를

24

최근에 좋고 좋지는 않지만 대부분 추악한 Java를 통해 트러 깅하고 있으며 Java 및 Java 개발자와 JS 및 Java 개발자에 대한 총체적 과잉 총 생성이 발생 하면서이 질문에 대한 답변을 추가하고 싶습니다. 실제로 유용한 진실과 모호한 무언가에 기반을 둔 JS 개발자.

IDE가 있지만 많은 사람이없는 이유를 이해하는 것이 도움이 될 수 있습니다

나는 노드 개발에 관심이 있다는 사실을 알게되어 Webstorm을 시도해 왔으며 실제로 그것을 구입 한 것은 나쁘지 않지만 여전히 WS보다 자주 Scite에서 js 파일을 여는 경향이 있습니다. 그 이유는 JS에서 훨씬 적은 양으로 더 많은 일을 할 수 있지만 UI 작업은 즉각적인 피드백을 제공하기 때문에 브라우저 개발 도구 (특히 Chrome 및 Firebug)는 실제로 매우 뛰어나고 (브라우저가 아닌 컨텍스트를 고려함) ) 변경된 코드를 재실행하면 컴파일 단계없이 빠르고 쉽게 수행 할 수 있습니다.

내가 상당히 확신하는 또 다른 것은 IDE가 기본적으로 JavaScript에서 감당할 수없는 조잡한 코드를 활성화하여 자체 요구를 생성한다는 것입니다. JS에서 어떻게 관리하는지 배우고 싶습니까? IDE없이 Java로 사소한 것을 작성하여 시작하는 것이 도움이 될 수 있으며 IDE 이동없이 해당 코드를 실제로 유지 관리 / 수정하려면 실제로 시작하고 생각 해야하는 것들에주의를 기울이십시오. 앞으로. IMO는 IDE가 있든 없든 유지 관리 가능한 코드를 작성하는 데 여전히 똑같은 것들이 중요합니다. 4 년짜리 프로그래밍 커리큘럼을 작성해야한다면 툴과 종속성을 왜곡시키지 않기 위해 처음 2 년 동안 IDE를 만질 수 없었습니다.

구조

복잡한 응용 프로그램을 다루는 숙련 된 JS 개발자는 코드를 구조화 할 수 있습니다. 실제로 우리를 위해 코드를 읽을 IDE가 부족한 초기 역사에서 더 나은 경향이 있지만, 표현력이 뛰어난 언어는 신중하게 코드를 작성하지 않으면 유지 관리 할 수없는 재난 코드베이스를 매우 빠르게 강력하게 표현할 수 있기 때문입니다.

실제로 Java 코드베이스를 이해하는 데 실제로 상당히 가파른 학습 곡선을 보았습니다. 마지막으로 적절한 OOP가 없다는 것을 깨달았습니다. 클래스는 콩이나 DTO 또는 정적 게터 / 세터에 앉아있는 전역 적으로 사용 가능한 데이터를 변경하는 느슨하게 관련된 메서드 묶음에 지나지 않습니다. 기본적으로 OOP가 대체해야했던 것과 같은 오래된 짐승입니다. 그래서 기본적으로 코드를 찾고 생각하는 것을 중단했습니다. 방금 바로 가기 키를 배우고 혼란을 추적했으며 모든 것이 훨씬 순조롭게 진행되었습니다. 따라서 이미 습관이 없다면 OOD에 대해 훨씬 더 열심히 생각하십시오.

최상위 수준의 잘 구성된 JS 앱은 복잡한 기능 (예 : jQuery)과 서로 상호 작용하는 객체로 구성되는 경향이 있습니다. 어떤 언어로든 잘 구조화되고 쉽게 유지 관리되는 앱의 마크는 IDE 또는 메모장 ++로 볼 때 완벽하게 읽을 수 있다는 것입니다. 이것이 의존성 주입과 테스트 우선 TDD를 극도로 중요하게 여기는 주요 이유 중 하나입니다.

그리고 마지막으로 수업을 시작하십시오. 프로토 타입 상속을 배우십시오. 실제로 상속이 필요할 때 구현하기가 실제로 매우 우아합니다. 나는 JS에서 합성 접근법이 훨씬 더 잘 작동하는 경향이 있음을 발견하고 개인적으로 병이 나기 시작하고 어떤 언어로든 1-2 단계 이상의 상속이있을 때마다 EXTJS 야간 테러가 발생합니다.

핵심 원칙

DRY, YAGNI, 가장 놀랍게도의 원칙, 문제 영역의 깔끔한 분리, 인터페이스에 쓰기 및 사람이 읽을 수있는 코드 작성이 필자의 개인적 핵심입니다. 이러한 관행의 포기를 옹호하는 좀 더 복잡한 것은 어떤 언어로도 Kool Aid, 특히 다음 사람을 위해 매우 혼란스러운 코드를 남길 수있는 JavaScript와 같은 언어로 간주해야합니다. 예를 들어, 느슨한 커플 링은 객체 간 상호 작용이 발생하는 곳을 알 수 없을 때까지 사용할 수 있습니다.

동적 타이핑을 두려워하지 마십시오

JavaScript에는 많은 핵심 유형이 없습니다. 대부분의 경우 동적 캐스팅 규칙은 실용적이고 간단하지만 규칙을 배우는 데 비용이 들기 때문에 불필요한 캐스팅과 무의미한 유효성 검사 루틴없이 데이터 흐름을 관리하는 방법을 더 잘 배울 수 있습니다. 날 믿어. 엄격한 유형은 성능 및 컴파일 문제를 발견하는 데 유용하지만 어떤 것도 보호하지 못합니다.

JS 함수와 클로저에서 크랩을 배우십시오

JS의 일류 기능은 아마도 JS가 "고객 상 웹에 상을 건 드리는 언어 만 상"을 수상한 주된 이유 일 것입니다. 그렇습니다. 실제로 경쟁이있었습니다. 또한 JS의 핵심 기능입니다. 우리는 그들과 함께 물건을 만듭니다. 모든 것은 기능 범위입니다. 그리고 그들은 편리한 기능을 가지고 있습니다. arguments 키워드를 통해 params를 검사 할 수 있습니다. 다른 객체의 메소드라는 맥락에서 일시적으로 첨부하고 해고 할 수 있습니다. 또한 외설적으로 구현하기 쉬운 이벤트 중심 접근 방식을 만듭니다. 요컨대, JS는 복잡성을 줄이고 소스 자체에서 JS 자체 (대부분 DOM API)의 다양한 구현을 적응시키는 데있어 절대적인 짐승이되었습니다.

채택하기 전에 패턴 / 연습 재평가

퍼스트 클래스 함수와 동적 타입은 더 복잡한 디자인 패턴을 JS에서 완전히 무의미하고 번거롭게 만듭니다. 그러나 간단한 패턴 중 일부는 JS의 매우 유연한 특성으로 인해 매우 유용하고 구현하기 쉽습니다. 어댑터와 데코레이터가 특히 유용하며 단일 UI가 빌드하는 ui 요소의 이벤트 관리자 역할을하는 복잡한 UI 위젯 팩토리에 유용합니다.

언어의 리드를 따르고 적은 비용으로 더 많은 것을하십시오

Java 헤드 혼초 중 하나가 상세가 실제로 모든 당사자가 코드를 이해하기 쉽게 만드는 긍정적 인 기능이라는 주장을했다고 생각합니다. 호그 워시. 그것이 사실이라면, 합법적 인 사람들은 읽기가 더 쉬울 것입니다. 작가 만이 자신이 작성한 것을 이해하기 쉽게 만들 수 있으며 때로는 다른 사람의 신발에 자신을 넣어야 만 할 수 있습니다. 따라서이 두 규칙을 받아들이십시오. 1. 가능한 한 직접적이고 명확해야합니다. 2. 이미 망할 지점으로 가십시오. 승리는 깨끗하고 간결한 코드가 트리거에서 실제 원하는 동작으로 이동하기 위해 25 개의 레이어를 통과해야하는 것보다 이해하고 유지하기가 훨씬 쉽다는 것입니다. 더 엄격한 언어로 이런 종류의 것을 옹호하는 대부분의 패턴은 실제로 JavaScript에없는 제한 사항에 대한 해결 방법입니다.

모든 것은 가단성이며 괜찮습니다

JS는 아마도 가장 많이 사용되는 보호주의 언어 중 하나 일 것입니다. 받아 들여 잘 작동합니다. 예를 들어 생성자 함수에서 일반 vars를 선언하여 액세스 할 수없는 영구 "private"vars로 객체를 작성할 수 있으며이 작업을 자주 수행합니다. 그러나 내 코드 또는 코드 사용자를 "자신으로부터"보호하지는 않습니다 (어쨌든 런타임 중에 자체 버전으로 바꿀 수 있습니다). 그러나 다른 사람이 의존성을 얽매이지 않기에 충분히 유능하고 당신이 아마 좋은 이유 때문에 직접 그것을 얻을 수 없다는 것을 알기 때문에 오히려 의도를 신호하는 것입니다.

크기 제한이없고 문제 도메인 만 있음

내가 본 모든 Java 코드베이스에서 가장 큰 문제는 클래스 파일이 너무 많다는 것입니다. 우선 SOLID는 OOP에 대해 이미 알아야 할 사항에 대한 혼란스러운 반복입니다. 클래스는 특정 일련의 관련 문제를 처리해야합니다. 하나의 방법으로 하나의 문제가 아닙니다. 그것은 부팅 할 모든 무의미한 클래스 구문을 추가해야만 나쁜 오래된 체인화 func-spaghetti C 코드 만 사용합니다. 크기 나 방법 제한이 없습니다. 이미 긴 함수 나 클래스 또는 생성자에 무언가를 추가하는 것이 이치에 맞습니다. jQuery를 사용하십시오. 단일 함수의 전체 라이브러리 길이 도구 세트이며 아무런 문제가 없습니다. 여전히 jQuery가 필요한지 여부는 합리적인 논쟁이지만 디자인 측면에서

Java가 모두 알고 있다면, C 기반이 아닌 구문을 사용하여 무언가 문제가 발생합니다

Django에 대해 듣고있는 것을 좋아해서 Python을 망치기 시작했을 때 언어 디자인에서 구문을 분리하는 것을 시작했습니다. 결과적으로 Java와 C를 동일한 구문으로 다르게 수행하는 것이 아니라 언어 설계 부분의 합계로 이해하기가 쉬워졌습니다. 좋은 부작용은 디자인 측면에서 다른 언어를 더 많이 이해할수록 대비를 통해 가장 잘 알고있는 언어의 장단점을 더 잘 이해할 수 있다는 것입니다.

결론

이제 모든 것을 고려하여 모든 문제를 해결하십시오.

  • 함수의 진입 점을 즉시 찾을 수있는 방법이 없습니다 (일반 텍스트 검색 이외의 경우, 2 개 또는 3 개의 시작 위치를 잊어 버린 후 호출 계층을 추가로 메소드에 대한 후속 검색으로 이어질 수 있음)

Chrome과 Firebug에는 실제로 통화 추적 기능이 있습니다. 그러나 구조에 대한 나의 요점과 간결하고 직접적인 것을 유지하십시오. 서로 상호 작용하는 잘 캡슐화 된 더 큰 구조로 앱을 더 많이 생각할수록 문제가 발생했을 때 누구의 잘못인지 쉽게 파악할 수 있습니다. 나는 이것이 Java의 경우에도 마찬가지라고 말하고 싶습니다. 우리는 전통적인 OOP 문제에 대해 완벽하게 서비스 할 수있는 클래스 유사 함수 생성자를 가지고 있습니다.

function ObjectConstructor(){
    //No need for an init method.
    //Just pass in params and do stuff inside for instantiation behavior

    var privateAndPersistent = true;

    //I like to take advantage of function hoisting for a nice concise interface listing
    this.publicAndPointlessEncapsulationMurderingGetterSetter
    = publicAndPointlessEncapsulationMurderingGetterSetter;
    //Seriously though Java/C# folks, stop with the pointless getter/setters already

    function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
        if(arg === undefined){
            return privateAndPersistent;
        }
        privateAndPersistent = arg;
    }

}

ObjectConstructor.staticLikeNonInstanceProperty = true;

var instance = new ObjectConstructor();//Convention is to  capitalize constructors

내 코드에서는 객체 리터럴 {}을 구조적 응용 프로그램 구성 요소로 사용 하지 않습니다. 내부 (비공개) 변수를 가질 수 없으므로 대신 데이터 구조로 사용하기 위해 예약하는 것을 선호하기 때문입니다. 이는 의도의 명확성을 유지하는 기대치를 설정하는 데 도움이됩니다. (컬리가 보이면 앱 아키텍처의 구성 요소가 아닌 데이터입니다).

  • 매개 변수는 실제로 프로그램을 실행하고 함수가 호출 된 지점으로 이동하고 console.logs를 사용하여 모든 특성을 출력하는 것을 제외하고 해당 매개 변수에서 사용 가능한 특성 및 함수를 알 수있는 방법없이 함수에 전달됩니다. 유효한)

다시 현대 브라우저 도구를 참조하십시오. 또한 프로그램을 다시 실행하는 것이 왜 그렇게 번거로운가? 재로드는 클라이언트 측 웹 개발자가 일반적으로 몇 분마다 수행하는 것입니다. 이것은 앱 구조가 도움이 될 수있는 또 다른 요점이지만 계약을 시행 할 때 자체 유효성 검사를 실행해야하는 JS의 단점 중 하나입니다 (내 코드베이스가 수행하는 다른 일에 노출 된 엔드 포인트에서만 할 수있는 일). 제어하지 않음). IMO, 트레이드 오프는 그만한 가치가 있습니다.

  • 익명 함수를 콜백으로 자주 사용하므로 혼동되는 코드 경로 스파게티가 생겨 빠르게 탐색 할 수 없습니다.

네, 사소한 일에는 좋지 않습니다. 하지마 당신의 기능을 아이 이름을 지정하십시오. 물건을 추적하는 것이 더 쉽습니다. 다음과 같이 간단한 사소한 기능을 정의, 평가 (할당해야 함) 및 할당 할 수 있습니다.

doSomethingWithCallback( (function callBack(){}) );

이제 통화를 추적 할 때 Chrome에 이름이 지정됩니다. 사소한 기능의 경우 호출 외부에서 정의합니다. 또한 변수에 지정된 익명 함수는 여전히 익명입니다.

  • 그리고 JSLint는 런타임 전에 약간의 오류를 포착하지만 브라우저에서 직접 코드 아래에 빨간색 물결 모양의 선을 갖는 것만 큼 편리하지는 않습니다.

나는 물건을 만지지 마십시오. Crockford는 커뮤니티에 좋은 것들을 제공했지만 JSLint는 선을 문체 선호도에 넘기고 JavaScript의 특정 요소는 특별한 이유가 없기 때문에 나쁜 부분이라고 제안합니다. IMO. regEx 및 부정 클래스 뒤에 * 또는 +가 있다는 것을 분명히 무시하십시오. 와일드 카드의 성능이 저하되고 {}을 사용하여 반복을 쉽게 제한 할 수 있습니다. 또한 함수 생성자에 대해 언급 한 내용은 무시하십시오. 새로운 키워드가 귀찮 으면 공장 기능으로 쉽게 포장 할 수 있습니다. Crockford가 아닌 CSSLint는 나쁜 조언에있어 훨씬 더 나쁩니다. 항상 소금 한알로 말을 많이하는 사람들을 데려가십시오. 때때로 나는 그들이 권위를 확립하거나 새로운 재료를 생성하려고한다고 맹세합니다.

그리고 다시, 당신은 당신이 가지고있는이 런타임 문제로 배운 것을 배우지 않아야합니다. (많은 Java / C # 개발자들에게 보인 흔한 일입니다.) 런타임에서 오류가 2 년 후에도 계속 귀찮게된다면, 브라우저에 스팸이 다시로드되어 침입 할 때까지 기다리십시오. 컴파일 타임 / 런타임 분할이 아닙니다 (아직 눈에 띄는 것은 아닙니다-JS는 지금 JIT에서 실행됩니다). 런타임에 버그를 발견하는 것은 괜찮을뿐만 아니라, 저렴하고 쉽게 스팸을 다시로드하고 도착하는 모든 중지 지점에서 버그를 발견하는 데 큰 도움이됩니다.

그리고 Chrome 개발 도구를 사용하십시오. 웹킷에 직접 내장되어 있습니다. Chrome에서 마우스 오른쪽 버튼을 클릭하십시오. 요소를 점검하다. 탭을 탐색하십시오. 런타임 중에 콘솔에서 코드를 변경하는 기능과 함께 많은 디버그 성능이 가장 강력하지만 덜 분명한 옵션 중 하나입니다. 테스트에도 좋습니다.

관련 메모에서 오류는 친구입니다. 빈 캐치 문을 작성하지 마십시오. JS에서는 오류를 숨기거나 묻지 않습니다 (또는 최소한 YUI / cough 기침 해서는 안됩니다 ). 우리는 그들에게 참석합니다. 적은 것은 디버그 고통을 초래할 것입니다. 그리고 프로덕션에서 잠재적 오류를 숨기기 위해 catch 문을 작성하면 최소한 자동으로 오류를 기록하고 로그에 액세스하는 방법을 문서화하십시오.


3
... 답의 크기 Upvoting
플로리안 Margaine

5

당신이 말하는 것은 자바 스크립트를보고있는 자바를 좋아하는 사람의 공통된 이해 일뿐입니다.

먼저 질문에 대답합시다 ...

... 제 질문은 다른 프로그래머들이 어떻게 이러한 문제에 대처 하는가입니다 ...

답 : 그들은하지 않습니다. 먼저 Java 컬트를 포기함으로써 JavaScript 철학을 배웁니다.

이 전제를 이해해야합니다 ... JavaScript는 Java가 아닙니다. 그것은 단지 구문에 관한 것이 아니라 철학에 관한 것입니다.

이제 그것들 중 일부를 살펴 봅시다 ...

  • 메소드가 호출되거나 상수가 사용 된 모든 위치를 즉시 봅니다 (오픈 콜 계층 / 참조 표시)

    함수 / 멤버 / 클래스 이름을 Control- 클릭하여 정의로 바로 이동

    이 모든 것이 가능합니다. 알맞은 IDE를 선택하십시오.

  • 정적 입력은 코드 완성을 사용하여 객체에서 사용 가능한 모든 매개 변수 / 기능을 표시 할 수 있음을 의미합니다.

    이것은 당신이 대처 하는 문제가 아닙니다 . 이것은 프로그래밍에 대한 당신의 견해를 바꿔야하는 것입니다. 느슨한 유형 시스템은 JavaScript의 장점 중 하나입니다. 느슨한 타이핑을 이해하고 이해하는 법을 배웁니다. 게다가 코드 완성은 JS와 매우 잘 작동합니다.

  • 그리고 JSLint는 런타임 전에 약간의 오류를 포착하지만 브라우저에서 직접 코드 아래에 빨간색 물결 모양의 선을 갖는 것만 큼 편리하지는 않습니다.

    Firebug, Chrome / Safari 콘솔 및 IDE조차도 그 이상을 수행합니다.

    Java 프로그래머가 사용하는 멋진 정적 분석을 수행 할 수있는 JSHint가 있습니다.

  • 결론은 항상 전체 프로그램을 머릿속에 두어야한다는 것입니다. 이것은 복잡한 프로그램 작성을위한인지 부하를 크게 증가시킵니다.

    잘못된! 반대로 JavaScript는 "경량"프로그래밍 언어이며 더 간단한 프로그램을 사용하도록 권장합니다. Doug Crockford는 다음과 같이 말합니다 . JavaScript로 무거운 모델 기반 프로그램을 작성하려고하면 "처벌"됩니다.

  • 프로그램이 약간 쉽고 빠르 게 작성 될 수 있지만 내 경험상 프로그램을 읽고 디버깅하기가 훨씬 어렵습니다.

    완전히 틀렸다! 프로그래밍 언어에 따라 가독성을 어떻게 결정합니까? 프로그램은 언어가 아닌 읽을 수 있거나 읽을 수 없습니다. 또한 JavaScript에는 환상적인 디버거가 있습니다.

조금 무례한 소리가 들리면 용서해주십시오.하지만 사실 자바 스크립트를 이해 하려면 자바 속성을 바꿔야 합니다.

오직 "성숙한"Java 프로그래머 만이 JavaScript를 좋아할 수 있습니다. 다시 한 번 뭉툭하게해서 죄송합니다.


2
"함수 / 구성원 / 클래스 이름을 직접 클릭하여 정의로 바로 이동할 수있는"JavaScript IDE가 있습니까? Java 및 Scala 용 Eclipse를 사용하지만 JavaScript 용 IDE / 편집기가 부족합니다.
Jonas

11
비판을받을 준비가되었지만 여기에있는 일부 내용은 잘못되었습니다. 객체를 만든 다음 함수에 전달하면 매개 변수를 Ctrl 키를 누른 채 클릭하여 속성을 볼 수 있습니까? 객체가 무엇이든 될 수 있기 때문에 나는 할 수 없습니다. 객체 속성 이름 중 하나를 잘못 입력하면 경고합니까? 아닙니다. JS에서 오류가 아니기 때문에 원하는 것은 아닙니다. 유용한 코드 완성은 불가능합니다. 함수의 매개 변수가 소유 한 속성을 찾으려면 함수를 호출 한 코드를 통해 개체를 만들어 개체를 만든 위치를 찾아야합니다.
funkybro

3
JS가 구축되는 방식으로 인해 IDE에서 코딩하기가 더 어려워 질 수 있습니다. Java에서 동적 속성을 사용하여 원하는 동안 근처에 객체를 설치하거나 런타임 동안 객체를 검사 할 수는 없다고 불평합니다. 두 언어는 철학이 매우 다릅니다. JS와 대부분의 다른 언어보다 Java와 JS 개발자간에 더 큰 연결 끊김을 만드는 방식으로 생각합니다. 개인적으로 C가 Java보다 적응하기가 더 쉽다는 것을 알았으며 부풀어 오른 IDE로 작업하는 것을 싫어했습니다.
Erik Reppen

2
Google의 Java 개발자조차도 JS를 작성할 때 Java에서 빠져 나올 수 없습니다. sitepoint.com/google-closure-how-not-to-write-javascript
Erik Reppen

3
당신 은 다음같이 씁니다 : JavaScript는 Java가 아니며 JavaScript 를 이해하기 위해 Java 성향을 변경해야합니다 . "성숙한"Java 프로그래머 만이 JavaScript를 이해할 수 있습니다. 따라서 Javascript를 이해하려면 먼저 Java를 마스터 한 다음 모든 것을 잊어야합니다. 그것?
Caleb

3

일반적으로 IDE가 런타임의 일부가 아닌 경우 (예 : 스몰 토크) 동적 언어에 대해 언급 한 도구를 사용하는 것은 어렵습니다. 정말 좋은 텍스트 편집기를 배우면 대부분의 IDE가 덜 매력적으로 보입니다.


2

그것은 우리가 형편없는 언어를 사용하기 위해 지불하는 가격입니다. 이 가증이 왜 그렇게 대중화되었는지 궁금해 할 수 있습니다. 단점은 잘못 입력 한 언어의 장점보다 훨씬 큽니다.

아마도 우리는 이 쓰레기에 비 협력 원칙 을 적용하여 폐기해야 할 것입니다.


3
"잘못 입력 된 언어"-많은 프로그래머가 동의하지 않습니다.
Sean McMillan

7
+1, Javascript가 인기있는 유일한 이유는 적절한시기에 적절한 장소에 있었기 때문입니다.
maple_shaft

2
A. Node.js가 Java 대신 C ++에 바인딩되어 있다는 것이 슬프습니다.
Erik Reppen

1
"잘못 입력 된 언어"의 의미가 무엇인지 잘 모르겠습니다. JavaScript가 "잘 못 입력되었습니다". 동적으로 입력되며 작업으로 인해 유형이 강제 될 수 있습니다. 에디터 / IDE가 변수의 타입을 모르기 때문에 언어를 비난하지 마십시오. 어쨌든 알아야합니다.
Ryan Kinal

3
@RyanKinal 정말요? 당신이 알아야 할 모든 의 속성과 메서드 모두 전체 응용 프로그램 내에서 객체와 클래스를, 그리고 언어의 API, 그리고 당신이 사용하고있는 라이브러리의 메모리로 ? 인지 코드를 줄이고 생각할 부분을 줄임으로써 생산성을 크게 향상시키는 IDE 코드 완성 개념을 거부합니까?
funkybro

2

나는 자바 스크립트 (및 동적 타이핑)를 싫어했지만 객체 지향, 클로저함수형 프로그래밍 을 높이 평가했습니다 . 또한, 전역 객체자동 유형 변환 제거는 내가 처음 발견했을 때 신선한 공기를 마셨다.

jQuery intellitext를 쉽게 사용할 수 있기 때문에 자바 스크립트에 대한 선호하는 아이디어webstorm입니다 (부끄러운 것이 아닙니다).

또한, 나는 그것의 유비쿼터스가 이미 커지고 있다고 말하지 않을 것입니다.

특정 포인트 :

함수의 진입 점을 찾는 즉각적인 방법이 없음

나는 이것을 이해하지 못한다. 어떻게 더 간단 할 수 있니?

매개 변수는 해당 매개 변수에서 사용 가능한 특성 및 함수를 알 수있는 방법없이 함수에 전달됩니다.

객체 정의를 포함하도록 아이디어를 설정하면 객체의 속성을 intellitext를 통해 사용할 수 있습니다 (그러나 여기서 요점을 놓쳤을 수 있습니다).

익명 함수를 콜백으로 자주 사용하므로 혼동되는 코드 경로 스파게티가 생겨 빠르게 탐색 할 수 없습니다.

일반적인 사용법? 익명의 기능이 마음에 들지 않으면 사용하지 마십시오. 아니면 실질적으로 사용하는 jQuery를 언급하고 있습니까? jQuery는 아마도 대부분의 웹 개발자들에 의해 웹 개발 역사상 가장 큰 시간 절약 요소로 여겨 질 것입니다 .

JSLint가 런타임 전에 일부 오류를 포착합니다

그것은 그들 모두를 잡아, 당신은 당신의 아이디어에 포함 할 수 있습니다 . 또는 Webstorm에는 기본적으로 포함되어 있습니다 (생각합니다).


유비쿼터스가되고 공정한 인기를 얻는 것이 반드시 같은 것은 아닙니다! ;-) 어쨌든 webstorm은 JavaScript를위한 훌륭한 IDE입니다 (무료는 아니지만 저렴합니다). 나는 그것을 사용하지는 않았지만 IntelliJ (Jetbrains의)도 Java 배경에서 단일 IDE를 사용하려는 경우 관련이있을 수있는 동일한 기능을 포함하고 있다고 생각합니다.
FinnNk

확인해야 할 수도 있습니다. 브라우저 / DOM을 사용하여 개발 환경에서 "인기 성장"을 의미했습니다. 즉, 다른 대안이있는 곳에서 사용됩니다. "함수의 진입 점"이란 함수가 호출되는 코드에서 해당 지점을 찾는 것을 의미했습니다. 매개 변수 속성 : IDE가 런타임 전에 주어진 객체의 속성을 알 수있는 방법없습니다 ! 익명 함수 : 나는 그것들을 좋아하지 않을 수도 있지만 유지 해야하는 코드를 가진 다른 사람들도 좋아합니다. JSLint는 않습니다 하지 내가 예를 들어, 특정 개체의 속성 이름을 잘못 입력했는지 알고있다.
펑키 브로

@funkybro "IDE가 런타임 전에 주어진 객체의 속성을 알 수있는 방법은 없습니다" "idea에"whateverMyObjectIs.js "를 참조 된 스크립트로 포함시키고 잘못 입력 된 속성 이름에 대해서는 웹 스톰을 사용해보십시오. (정확하게 기억한다면).
NimChimpsky

3
없기! 이 코드를 고려 : var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); 어떻게 수에 IDE의 서비스 코드 완성 myFuncparam매개 변수? param속성이있는 모든 유형의 객체 일 수 있습니다.
펑키 브로

예, 그러나 아마도 전달하는 매개 변수는 실제로 해당 컨텍스트에서 사용할 수 있습니다. 파서는 자체 JS 해석기없이이를 분류 할 수 있습니다.
Erik Reppen

2

내가 무엇을 놓치고 있습니까?

Javascript가 Java에 비해 두 가지 큰 장점이 없습니다.

  • Javascript 코드는 동등한 Java 코드 크기의 약 1/4입니다.
  • 컴파일 및 서버 재시작을 기다릴 필요가 없습니다.

Javascript에서 다르게 작동합니다. 테스트하고 브라우저를 새로 고치고 테스트 할 수있는 한 작은 코드를 한 번에 조금씩 추가합니다. jQuery를 사용하면 몇 줄의 Javascript 만 있으면됩니다.

Java 프로그래밍이 상대적으로 비생산적 이라는 것을 알았습니다. 동일한 두 가지 이유로 Groovy에서 모든 서버 측 코드를 작성하고 있습니다.


5
"자바 스크립트 코드는 동등한 Java 코드 크기의 약 1/4입니다"<-이것이 문제입니다! 익명 함수를 만들고 객체에 속성을 추가하고 색종이처럼 던지는 것이 빠릅니다. 그러나 다른 사람이 귀하의 코드를 방문하여 무슨 일이 일어나고 있는지 파악하려고 할 때 어떻습니까? 게다가 자바에서 더 많은 코드가 반드시 더 많은 타이핑을 요구하는 것은 아닙니다.
funkybro

3
@ funkybro : 이클립스가 씁니다 ... 그런 다음 프로젝트 수명 동안 그것을 지나쳐 붙어 있습니다. 그것이 필요하지만 사소한 플러그인이 그것을 생성 할 수 있다면 언어 냄새입니다. Javascript 클래스에는 조금 더 많은 문서가 필요합니다. 그러나 Java 메소드 서명을 아는 것만으로는 충분하지 않습니다.
kevin cline

1
필요하지 않습니다! 항상 리플렉션을 사용하여 메소드를 호출하고 원하는 경우 일반 오브젝트, 목록 및 맵만 사용하여 Java로 Javascript를 시뮬레이션 할 수 있습니다. 그러나 대부분의 개발자 IME (자백하지는 않습니다!) 는 의미있는 데이터 유형을 정의하기로 선택 합니다. 유지 보수 가능하고 자체 문서화 코드를 작성하는 데 도움이됩니다.
funkybro

1
리플렉션을 통해 Java가 런타임 중에 객체를 수정할 수 있습니까? 폐쇄는 어떻습니까? 언어를 비판하거나 Java로 가정하기 전에 언어를 배우십시오. 어셈블리 외부에서 가장 닫힌 패러다임 언어는 언어를 에뮬레이트 할 수 있습니다.
Erik Reppen

1
Downvoters : 이것은 Java와 Javascript에 대한 국민 투표가 아닙니다. 이유없이 공감하는 것은 무례합니다.
케빈 클라인

0

나는이 질문이 오래되었지만 같은 느낌을 가지고 있지만 지난 10 년 동안 많은 JavaScript를해온 C ++ / C # 프로그래머로서 Visual Studio Code 를 사용해 보는 것이 좋습니다 .

물론 강력한 형식의 언어로 추가 할 수있는 모든 기능을 제공 할 수는 없지만 상당히 가깝습니다.

또한 typescript에서 유형 정보를 가져 와서 JavaScript에 적용 할 수 있습니다. typescript를 사용하지 않아도 JavaScript로 입력 할 때 수많은 API에 대한 코드 완성 및 문서를 얻을 수 있습니다.

그래서 당신의 질문에

  • 함수의 진입 점을 즉시 찾을 수있는 방법이 없습니다 (일반 텍스트 검색 이외의 경우, 2 개 또는 3 개의 시작 위치를 잊어 버린 후 호출 계층을 추가로 메소드에 대한 후속 검색으로 이어질 수 있음)

VSCode에서 주로 해결 된 것 같습니까?

  • 매개 변수는 해당 매개 변수에서 사용 가능한 특성 및 함수를 알 수있는 방법없이 함수에 전달됩니다.

이것은 JSDoc 스타일 주석 또는 typescript로 코드를 문서화하여 많은 IDE에서 해결됩니다. 편집자는 의견을 읽고 예전과 같은 완성도를 제공합니다

익명 함수를 콜백으로 자주 사용하므로 혼동되는 코드 경로 스파게티가 생겨 빠르게 탐색 할 수 없습니다.

C # 프로그래머로서 익명 함수도 일반적이며 C ++에 추가되었습니다. 나는 이것이 당신이 익숙해 져야 할 것이라고 생각합니다.

또한 콜백은 주로 약속 및 async / await로 대체되었지만 콜백을 사용하는 API가 있으면 약속을 사용하도록 신속하게 래핑 한 다음 async / await를 사용하여 문제를 해결할 수 있습니다.

그리고 JSLint는 런타임 전에 약간의 오류를 포착하지만 브라우저에서 직접 코드 아래에 빨간색 물결 모양의 선을 갖는 것만 큼 편리하지는 않습니다.

Visual Studio Code에 물결 선이 생깁니다. 뿐만 아니라 ESLint 통합을 켜면 편집기에서 놀라운 경고 및 오류가 강조 표시됩니다. 실제로 다른 언어에서 본 것보다 더. 내 경험은 ESLint가 대규모로 구성 가능하고 확장 가능하며 인기있는 라이브러리가 통합되어 편집기의 특정 라이브러리 사용에 대한 조언과 경고를 제공 할 수있는 C / C # / Java에 대한 린 터는 꽤 하드 코딩되었습니다. 내가 다른 언어로 개인적으로 보지 못한 것 (다른 언어에서도 공통적 일지 모르지만)

또한 2018 년이며 ES7이 새로운 표준이므로 얻을 수 class있습니다. 항상 엄격 모드를 사용하십시오. 당신은 사용하지 않습니다 var항상 사용 const하고 let및 C ++ / C #을 / 자바 프로그래머가 힘든 시간을 가지고있는 것들의 무리는 사라의 종류에 익숙해. no-undefESLint 에서 규칙을 켜면 더 많은 문제가 사라집니다.

그것은 thisC ++ / C # / Java와 같지 않기 때문에 실제로 어떻게 작동하고 함수와 메소드가 어떻게 작동 하는지 배웁니다 .

처음 2 ~ 3 년간의 JavaScript는 좌절되었습니다. 어느 시점에서 그것은 클릭했다. 나는 C ++ / C # / Java가되도록 강요하려고 노력하지 않았고 이제 JavaScript에서 15 줄이 걸리는 것이 다른 언어에서 150을 취할 때 뒤로 돌아가는 것이 좌절됩니다.


-1

IDE를 좋아하고 일식에 사용되는 경우 JavaScript 용 IDE로 Aptana를 확인하십시오. 나는 그것이 당신이 원하는 많은 것을 할 수 있다고 생각합니다. (개인적으로 IDE를 싫어하지만 다른 대화입니다).

익명 함수의 경우 JavaScript에서 가장 강력한 기능 이며이 기능이없는 언어로 작업하려고하면이 시점에서 매우 고통 스럽습니다.

JavaScript로 컴파일 할 수있는 다른 것을 원한다면 CofffeeScript, Clojure 및 GWT 옵션이 많이 있지만 다른 옵션도 있습니다.


2
나는 Aptana를 한 번 시도했지만 정말 나쁩니다. 자동 들여 쓰기 조차하지 않으며 같은 프로젝트에서 Eclipse와 Aptana를 사용하면 채색 및 물건과 같은 다른 Eclipse 편집기에서 설정 한 모든 프로젝트 설정을 파괴합니다.
Jonas

1
나는 그것을 잠시 동안 사용하고 그것을 미워했지만 IDE를 싫어한다고 말한 것처럼 명령 줄 도구로 서식을 지정하고 GVIM 또는 emacs에서 편집하고 있습니다 (내가하는 일에 따라 다름)
Zachary K

처음 몇 시간 동안 충돌이 발생하고 소수의 파일 외에는 아무것도 열리지 않습니다. 부 바이
Erik Reppen

웹 스톰은 나쁘지 않습니다. 나는 여전히 Scite를 대부분 사용하지만 Node.js를 작성할 때 IDE를 더 많이 느끼기 시작하고 눈에 보이는 브라우저 피드백과 개발 도구의 이점이 없습니다.
Erik Reppen

-1

나는 그것을 직접 사용하지는 않았지만 몇 가지 데모를 보았고 Cloud 9 에 JavaScript IDE로 매우 감동했습니다 .

온라인 서비스 모델을 모두 사용하거나 GitHub에서 다운로드 할 수 있습니다.

그리고 IDE로서의 품질의 증거로서 Cloud9는 Cloud9!

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