내가하고있는 튜토리얼 (자바 스크립트)은 다음과 같은 함수를 작성하도록 제안합니다.
function sayHello() {
//Some comments explaining the next line
window.alert("Hello");
}
난독 화 외에 실제 생활에서 이와 같은 것을 작성하면 이점이 있습니까? 그렇다면 어떤 이점이 있습니까?
내가하고있는 튜토리얼 (자바 스크립트)은 다음과 같은 함수를 작성하도록 제안합니다.
function sayHello() {
//Some comments explaining the next line
window.alert("Hello");
}
난독 화 외에 실제 생활에서 이와 같은 것을 작성하면 이점이 있습니까? 그렇다면 어떤 이점이 있습니까?
답변:
이 잘못된 경우 내 기억을 용서하십시오 ... Javascript는 선호하는 구현 언어가 아닙니다.
arg 함수를 사용하여 다른 함수 호출을 래핑하지 않으려는 몇 가지 이유가 있습니다. 에 대한 간단한 호출 window.alert("Hello");
은 대신 대신 직접 호출하는 것을 상상할 수있는 것입니다 sayHello()
.
그러나 더 많은 것이 있다면 어떨까요? 당신은 당신이 전화 sayHello()
하고 window.alert("Hello");
대신 서면 으로 12 곳이 있습니다 . 이제 당신은 그것을 원합니다 window.alert("Hello, it is now " + new Date())
. sayHello()
한 장소 를 바꾸면서 모든 통화를 감싼 경우 . 그렇지 않은 경우 12 곳에서 변경합니다. 이 항목은 반복하지 않음을 터치합니다 . 앞으로 수십 번 할 필요가 없기 때문에 그렇게합니다.
나는 과거에 i18n / l10n 라이브러리를 사용하여 텍스트를 클라이언트 측 지역화하는 기능을 사용했습니다. sayHello()
기능을 고려하십시오 . hola
사용자가 스페인어로 현지화 된 경우 인쇄 할 수 있습니다. 이것은 다음과 같이 보일 수 있습니다 :
function sayHello() {
var language = window.navigator.userLanguage || window.navigator.language;
if(language === 'es') { window.alert('Hola'); }
else { window.alert("Hello"); }
}
그러나 이것은 라이브러리가 작동하는 방식이 아닙니다. 대신 다음과 같은 파일 세트가있었습니다.
# English file
greeting = hello
# Spanish file
greeting = hola
그런 다음 라이브러리는 브라우저 언어 설정을 감지 한 다음 적절한 현지화 파일을 기반으로 인수가없는 함수 호출의 반환 값으로 적절한 현지화 를 사용하여 동적 함수 를 만듭니다 .
나는 그것이 좋든 나쁘 든 말할 수있는 Javascript 코더로는 충분하지 않습니다 ... 단지 그리고 가능한 접근법으로 볼 수 있습니다.
요점은 다른 함수에 대한 호출을 자체 함수로 래핑하는 것은 종종 매우 유용하며 응용 프로그램의 모듈화에 도움이되고 코드를 더 쉽게 읽을 수도 있습니다.
그 모든 것을 제쳐두고, 당신은 튜토리얼에서 일하고 있습니다. 처음에 가능한 한 간단하게 소개해야합니다. 처음부터 varargs 스타일 함수 호출을 도입하면 일반적으로 코딩에 익숙하지 않은 사람에게는 매우 혼란스러운 코드가 생길 수 있습니다. 이전의 예제와 이해를 바탕으로 각각의 건물을 사용하면 논란, 논증, varargs 스타일로 가기가 훨씬 쉽습니다.
window.alert
또한 멋진 모달 / 팝업을 디자인 / 구현할 수있을 때까지 개발 중에 자리 표시 자로 자주 사용되므로 언어 문제와 마찬가지로 훨씬 쉽게 전환 할 수 있습니다. 또는 이미 업데이트가있는 경우 몇 년 동안 설계를 업데이트하면 비슷한 변경이 필요할 수 있습니다.
때로는 구현을 숨기는 데 유용하다고 생각합니다.
function sayHello() {
window.alert("Hello");
}
그리고 이것은 나중에 변경할 수있는 유연성을 제공합니다
function sayHello() {
console.log("Hello");
}
난독 화 외에 실제 생활에서 이와 같은 것을 작성하면 이점이 있습니까? 그렇다면 어떤 이점이 있습니까?
중앙 집중화 : 구현이 한 줄로되어 있지만 자주 변경되는 줄인 경우 sayHello가 호출되는 곳보다 한 곳에서 변경하는 것이 좋습니다.
의존성 최소화 / 숨김 : 클라이언트 코드는 더 이상 윈도우 객체가 있음을 알 필요가 없으며 클라이언트 코드에 전혀 영향을 미치지 않고 전체 구현을 변경할 수도 있습니다.
계약 이행 : 클라이언트 코드는 sayHello 기능이있는 모듈을 예상 할 수 있습니다. 이 경우 사소한 경우에도 기능이 있어야합니다.
추상화 수준의 일관성 : 클라이언트 코드가 높은 수준의 작업을 사용하는 경우 창 개체 대신 'sayHello, sayBye'및 기타 'sayXXX'함수로 클라이언트 코드를 작성하는 것이 좋습니다. 실제로 클라이언트 코드에서는 '창'객체와 같은 것이 있는지 알고 싶지 않을 수도 있습니다.
다른 사람이 테스트를 언급하지 않은 것은 놀라운 일입니다.
선택한 "래핑 된"줄 window.alert('hello')
은 실제로 이에 대한 완벽한 예입니다. window
객체 와 관련된 것은 테스트하기가 정말 고통 스럽습니다. 응용 프로그램에서 1000 배를 곱하면 개발자가 결국 테스트를 포기할 것입니다. 다른 한편으로, sayHello
스파이로 함수를 클로버하고 그것이 호출 되었는지 테스트하는 것은 매우 쉽습니다 .
더 실용적인 예-실제로 누가 실제로 window.alert(...)
프로덕션 코드에서 사용 합니까? -시스템 시계를 확인 중입니다. 예를 들어 DateTime.Now
.NET, time(...)
C / C ++ 또는 System.currentTimeMillis()
Java 로 래핑 됩니다 . 당신은 정말 그들이뿐만 아니라 (거의) 조롱하는 것은 불가능 / 가짜가 있기 때문에, 당신은 삽입 할 수있는 의존성에 그 포장하려는 사람들이 읽기 전용 및 비 결정적 . 시스템 클럭 기능을 직접 사용하는 기능 또는 방법을 포괄하는 모든 테스트는 간헐적 및 / 또는 임의의 오류가 발생할 가능성이 큽니다.
실제 래퍼는 단선 기능입니다.- return DateTime.Now
디자인이 잘못되고 테스트 할 수없는 개체를 가져 와서 깨끗하고 테스트 가능한 개체로 만드는 데 필요한 전부입니다. 래퍼 대신 가짜 시계를 사용하여 원하는 시간을 설정할 수 있습니다. 문제 해결됨.
귀하의 질문에 대한 생각은 " alert("Hello");
직접 작성하지 않는 이유는 무엇 입니까? 매우 간단합니다."
대답은 부분적으로 당신이 정말로 전화하고 싶지 않기 때문입니다 alert("Hello")
- 당신은 단지 인사하고 싶습니다.
또는 전화 번호 만 누르면 전화에 연락처를 저장해야하는 이유는 무엇입니까? 그 숫자를 모두 기억하고 싶지 않기 때문입니다. 전화 번호는 지루하고 오류가 발생하기 쉽습니다. 숫자가 변경 될 수 있지만 다른 쪽 끝은 여전히 같은 사람입니다. 전화 번호가 아닌 사람 에게 전화를 걸고 싶기 때문입니다.
이것은 추상화, 간접, "구현 세부 정보 숨기기"및 "표현 코드"와 같은 용어로 이해됩니다.
모든 곳에서 원시 값을 쓰는 대신 상수를 사용하는 경우에도 동일한 추론이 적용됩니다. π가 필요할 때마다 쓸 수 는3.141592...
있지만 고맙게도 있습니다 Math.PI
.
우리는 또한 alert()
스스로를 볼 수도 있습니다 . 누가 경고 대화 상자를 구성하고 표시하는 방법에 관심이 있습니까? 사용자에게 알리고 싶습니다. 글을 쓰는 alert("Hello")
순간과 화면의 픽셀이 바뀌면 각 레이어마다 원하는 것을 알려주고 다음 레이어는 가능한 한 가장 깊은 레이어가 비트를 뒤집을 때까지 세부 사항을 처리합니다. 비디오 메모리.
당신은 정말로 인사하기 위해 모든 것을 스스로 할 필요는 없습니다.
글쎄, 어떤 작업이든, 프로그래밍은 복잡한 문제를 관리 가능한 덩어리로 나누는 것입니다. 각 청크를 해결하면 빌딩 블록이 생기고 간단한 빌딩 블록으로 큰 것을 만들 수 있습니다.
대수입니다.
값 (표현) 계산 을 조치 (문) 실행과 별도로 유지하는 것이 좋습니다 . 메시지 표시와 같이 작업이 수행되는 위치와시기를 정확하게 제어하기를 원하지만 값을 계산할 때보다 추상적 인 수준에서 작업하고 해당 값을 계산 하는 방법 에 신경 쓰지 않아도됩니다 .
주어진 인수 만 사용하여 리턴 값 만 계산하는 함수를 pure 라고 합니다.
액션을 수행하는 "함수"는 실제로는 프로 시저 이며 효과가 있습니다.
값을 계산하는 동안 발생한 모든 효과라고 부작용 , 그리고 ( "난 그냥 문자열, 나는 그것이 데이터베이스를 망치 것 몰랐 필요합니다!") 가능한 한이를 방지하는 것이 좋습니다.
부작용의 가능성을 최소화하려면 절차에 너무 많은 데이터를 보내거나 계산을 수행하지 않아야합니다. 일부 계산을 미리 수행해야하는 경우 일반적으로 순수한 함수에서 별도로 수행 한 다음 필요한 결과 만 프로 시저에 전달하는 것이 좋습니다. 이를 통해 프로 시저의 목적을 명확하게 유지하고 나중에 계산의 일부로 다시 사용할 가능성을 줄입니다 (순수한 함수를 대신 사용할 수 있음).
같은 이유로 프로 시저 내에서 결과를 처리하지 않아야합니다. 우리의 행동 결과 (있는 경우)를 반환하고 순수한 기능으로 후속 처리를 수행하는 것이 좋습니다.
이러한 규칙을 따르면 sayHello
데이터가 필요없고 결과가없는 절차가 생길 수 있습니다. 따라서 가장 좋은 인터페이스는 인수가없고 값을 반환하지 않는 것입니다. 예를 들어, 계산 중에 "console.log"를 호출하는 것이 좋습니다.
계산 중 효과의 필요성을 줄이기 위해 절차 를 반환 하는 계산을 할 수 있습니다 . 예. 수행 할 조치를 결정해야하는 경우, 직접 실행하지 않고 순수한 함수가 프로 시저를 선택하여 리턴하도록 할 수 있습니다.
마찬가지로, 절차 중 계산의 필요성을 줄이기 위해, 절차가 다른 절차를 매개 변수로 취하도록 할 수 있습니다 (함수의 결과). 예. 일련의 절차를 수행하고 차례로 실행합니다.
setFoo
변경 가능한 데이터를 의미하므로 호출을 권장하지 않습니다 . 변수 / 속성의 내용을 변경하면 해당 데이터를 사용하는 모든 계산이 불완전하게됩니다. 내가 권하고 싶지 않다 execute
자체로 통화를,하지만 난 것 추천 runFoo
자신의 주장을 기반으로 작업을 실행하기위한 절차를.
@MichaelT와 @Sleiman Jneidi가 제공 한 답변의 조합이라고 말하고 싶습니다.
아마도 코드에 Hello 메시지와 함께 사용자를 맞이하려는 많은 장소가 있기 때문에 아이디어를 메소드에 담을 수 있습니다. 이 방법에서는 더 긴 텍스트를 표시하여 번역하거나 간단한 'Hello'로 확장 할 수 있습니다. 또한 경고 대신 멋진 JQuery 대화 상자를 사용할 수 있습니다.
요점은 구현이 한 곳에 있다는 것입니다. 한곳에서 코드를 변경하면됩니다. (SayHello ()는 아마도 너무 간단한 예일 것입니다)