2011-12-04 7 views
1

코드를 작성할 때 함수 (원하는 경우, 메소드)를 모든 요소로 나눕니다. 함수 X는 X를 처리하고, Y는 응 응 Y를 수행하고, 이 아니며 메소드 X는 stuff X, Y & Z! 이것은 나에게 재사용 가능한 코드를 제공한다. 나는 그것을 좋아한다. :) 함수 내부에서 함수 호출하기

이 코드에 좀 걸릴 수 있습니다 :

var user = { 
    users: [], 
    userCount: 0, 
    addUser: function(user) { 
    (this.users).push(user); 
    }, 
    incrementCount: function() { 
    ++this.userCount; 
    } 
} 

var user = { // 2nd example. 
    users: [], 
    userCount: 0, 
    addUser: function(user) { 
    (this.users).push(user); 
    ++this.userCount; 
    } 
} 

(. 그것은 자바 스크립트,하지만 여기에 언어가 아닌 필수) 제 생각에는

를, 두 번째 예는 쉽고 될 것입니다을 사용하면 API 사용자에게 더 안전하게 사용할 수 있습니다. user.incrementCount()에 전화하는 것을 잊기 쉽습니다. 어떻게 생각해? 두 번째 예제는 자동으로 수행합니다.

어떻게 균형을 찾는가? 함수 내부에서 함수를 호출하는 모범 사례?

감사합니다.

편집는 :

이 지금 내 마음에 온 : 리터럴 객체를 사용하는 경우 기능이 진정으로 비공개로 할 수있는 방법이 없기 때문에

var user = { 
    users: [], 
    userCount: 0, 
    addUser: function(user) { 
    (this.users).push(user); 
    this.incrementCount(); 
    }, 
    incrementCount: function() { 
    ++this.userCount; 
    } 
} 

답변

5

그것은, JS에서 조금 다릅니다 표기법, 하지만 ... 그것은 모든 당신이 당신의 객체가 소비자에게 노출 할 API에 관하여

. API를 사용하는 소비자가 사용자 추가와 별도로 카운트를 증가 시키길 원하십니까? 그렇다면 : 그렇지 않으면

{ addUser: /* snip */, incrementCount: /* snip */ } 

다음 users 배열이 이미 당신을 위해 않기 때문에이 특별한 경우

{ addUser: /* snip */, _incrementCount: /* snip */ } 
// or just 
{ addUser: /* snip */ } 

, 난 강력하게, 전혀 별개의 수를 저장하기에 추천 할 것입니다.

var user = { 
    _users: [], 
    addUser: function(user) { 
     this._users.push(user); 
    }, 
    getUserCount: function() { 
     return this._users.length; 
    } 
    // and if you need to expose the users array directly, 
    , getUsers: function() { 
     return this._users; 
    } 
} 
+0

모든 API와'user' 그냥 예였다. – daGrevis

+0

예, 저는 그 예를 근거로 대답하고 있습니다. –

1

"기능 A-A-Stuff." 하지만 외부에서 숨겨져있는 데이터에서 작동하는 함수 (예 : 사용자 추가)는 데이터로 원하는 내용을 수행하고 데이터가 올바른지 확인해야합니다 (예 : 사용자 목록이있는 경우 Usercounter를 늘려 항상 올바른지 확인하십시오.) API 사용자가이 작업을 수행하도록 남겨두면 어쨌든 편안하지 않습니다.

사용자 목록에 더 많은 기능을 추가한다고 가정 해보십시오. 예를 들어, 사용자에게 목록에 추가되었으며 이진 트리에 사용자를 저장하는 등의 작업을 수행한다고 가정하면 모든 작업을 수행해야합니다. 귀하의 기능의 외부에서 조직 물건, 그게 어디 혜택입니까 ??

3

개인적으로 저는 API를 통해 해당 내용을 노출해야한다고 생각하지 않습니다. 또한 users.length을 사용하는 것이 더 쉽고 (적어도 자바 스크립트에서는) 더 직관적 일 것입니다.

궁극적으로 인터페이스를 정말 간단하게 유지하는 것이 일반적으로 좋은 방법이라고 생각합니다.추상화는 좋은 것입니다. 다른 사람의 도서관을 사용했다면 필자는 수동으로 그 값을 증가시킬 것으로 예상된다는 사실을 알고 실망하게되었습니다.

업데이트 :

내가 생각하는 한 가지 더 언급 할 가치가있다 : 당신은 단지 사용자의 인생을 더 쉽게 만들뿐 아니라하지

코드가 내부 상태를 유지 가진 간단한 API를 유지함으로써 가능하면 오용으로부터 보호하십시오. 누군가가 그 증분 방법을 잘못 사용하는 시나리오를 상상하기 쉽습니다. 결과적으로 그것은 부서 질 것입니다.

+0

OP의 특정 예를 바탕으로 정확하게 말하면 내 정서입니다. –

1

샘플 코드를 예제로 사용하려했지만 카운트 또는 길이 변수와 같은 것을 사용했기 때문에 왜 그런 식으로 독립적으로 설정할 수 있는지 이유를 생각할 수 없습니다. 항목을 추가하거나 제거하는 기능. 객체를 사용할 때 추가 할 때마다 add()increment() 메쏘드로 호출하고 싶지 않고 은 실제로 다른 객체없이 하나를 수행 할 수 있기를 원하지 않습니다. 무효 인 상태

그래서 나는 그에게 첫 번째 방법을하지 않을 것, 확실하게 당신이 당신의 편집에 추가 된 방법은 더욱 심각하다. 서로 함수를 호출하는 데 아무런 문제가 없지만 사용자의 예제에서는 증분 함수를 비공개로 설정하는 것이 좋습니다.

카운트 변수를 비공개로 설정하고 함수를 통해 검색하여 추가/제거 기능을 통해 설정할 수있게하는 것이 더 좋습니다 (단 users.length을 반환 할 수있을 때 카운트 변수가 필요하지 않음). 즉시 실행되는 익명 함수가있는 다음 패턴을 사용하면 private 변수와 함수를 가질 수 있으며 public 함수가 포함 된 객체 만 반환합니다. 공용 함수는 여전히 개인 변수/함수에 액세스 할 수 있지만 사적인 물건은 외부에서 액세스 할 수 없습니다.

var user = (function() { 
    var users = [], // private variables 
     private1, 
     private2; 

    function privateFunction1() { /* do something */ } 

    return { 
     getUserCount : function() { 
         return users.length; 
        }, 
     addUser:  function(user) { 
         users.push(user); 
         // return index of new user 
         return users.length - 1; 
        }, 
     getUser :  function(userIndex) { 
         return users[userIndex]; 
        }, 
     someFunc :  function(someParam) { 
         return someParam + privateFunction1(); 
        } 
    } 
})(); 

user.addUser("Fred"); 
user.addUser("Mary"); 
console.log(user.getUserCount()); // 2 
console.log(user.getUser(1));  // Mary