2012-04-13 6 views
2

나는 컨트롤 모듈 인 사용자 동작을 처리하는 특정 모듈을 가지고 있습니다. 6이 있었고, 이제 5가 있습니다. 2를 통합하면 Control이라는 모듈로 매우 유사합니다.코드 통합 대 복잡성

비슷한 코드를 통합하면 .... 덜 효율적이됩니다. 예를 들어 Control에서 프로그램 흐름을 결정하는 추가 논리 문이 있습니다.

if(this.type === 'signup' && !this.text_object.checkPattern('name')) 

이 간단한 라인

은 내가 유일한 차이에서 가지고 있지 않은 로그인 가입하기에서 이름을 확인되면서 ControlSignIn 및 ControlSignUp을 결합 할 수 있었다.

이 방법으로 계속할 수 있고 더 복잡한 코드를 얻을 수 있지만 코드 발자국은 더 작습니다.

(복잡도와 실행 시간) vs (코드 발자국) 사이에는 트레이드 오프가 있습니다.

나는 그것이 중요하지 않다고 생각하지만 나는 단지 확신하고 싶었다. 나는 또한 Control.

질문에 맞게 수있는 내가 ControlTweet에 넣어 예를 들어

?

ControlTweet을 Control과 통합해야합니까?

일반적으로 어디에서 선을 그 으려는가요 아니면 선호하는 문제입니까?

제어

/** 
*Control - receives incoming requests for client use 
*/ 

var Control = (function() 
{ 
    var Control = function (type) 
    { 
     this.TIME = 4000; 
     this.type = type; 
     this.form_element = document.getElementById(type), 
     this.response_element = document.getElementById(type + '_response'); 

     this.text_object = new TextValidator(this.form_element), 
     this.message_object = new Message(this.response_element), 
     this.effects_object= new Effects(this.response_element); 
    }; 
    Control.prototype.invoke = function() 
    { 
     if(Global.validate_input_on === 1) 
     { 
      if(!this.text_object.checkEmpty()) 
      { 
       this.message_object.display('empty'); 
       this.effects_object.fade('down', this.TIME); 
       return false; 
      } 
      if(this.type === 'signup' && !this.text_object.checkPattern('name')) 
      { 
       this.message_object.display('name'); 
       this.effects_object.fade('down', this.TIME); 
       return false; 
      } 
      if(!this.text_object.checkPattern('email')) 
      { 
       this.message_object.display('email'); 
       this.effects_object.fade('down', this.TIME); 
       return false; 
      } 
      if(!this.text_object.checkPattern('pass')) 
      { 
       this.message_object.display('pass'); 
       this.effects_object.fade('down', this.TIME); 
       return false; 
      } 
     } 
     var response_element = this.response_element; 
     new Ajax().invoke(serializeArray(this.form_element) + '&ajax_type=' + this.type + '_control', function(server_response_text) { ajaxType(server_response_text, response_element, 'respond'); }); 
    }; 
    Control.in = function() 
    { 
     new Control('signin').invoke(); 
    }; 
    Control.up = function() 
    { 
     new Control('signup').invoke(); 
    }; 
    Control.out = function() 
    { 
     new Ajax().invoke('&ajax_type=ControlSignOut', function(server_response_text) { ajaxType(server_response_text, 0, 'simple'); }); 
    }; 
    Control.try = function() 
    { 
     new Ajax().invoke('&ajax_type=ControlTryIt', function(server_response_text) { ajaxType(server_response_text, 0, 'simple'); }); 
    }; 
    return Control; 
}()); 

내가 사용 결국 무엇 ControlTweet

/** 
* ControlTweet 
*/ 

function interfaceTweet() 
{ 
    var fill_element = document.getElementById('tweet_fill'), 
     form_element = document.getElementById('tweet'), 
     response_element = document.getElementById('tweet_response'); 

    var text_object = new TextValidator(form_element), 
     message_object = new Message(response_element), 
     effects_object = new Effects(response_element); 

    if(Global.validate_input_on === 1) 
    { 
     if(!text_object.checkEmpty()) 
     { 
      message_object.display('empty'); 
      effects_object.fade('down', 4000); 
      return; 
     } 

     if(!text_object.checkPattern('tweet')) 
     { 
      message_object.display('tweet'); 
      effects_object.fade('down', 4000); 
      return; 
     } 
    } 
    new Ajax().invoke(serializeArray(form_element) + '&ajax_type=ControlTweet_add', function(server_response_text) { ajaxType(server_response_text, response_element, 'tweet', fill_element); }); 
} 

:

/** 
*Control - receives incoming requests for client use 
*/ 

var Control = (function() 
{ 
    var Control = function (type) 
    { 
     this.TIME = 4000; 
     this.type = type; 

     this.form_element = document.getElementById(type), 
     this.response_element = document.getElementById(type + '_response'); 
     if(type === 'tweet') { this.fill_element = document.getElementById(type + '_fill'); } 

     this.text_object = new TextValidator(this.form_element), 
     this.message_object = new Message(this.response_element), 
     this.effects_object= new Effects(this.response_element); 
    }; 
    Control.prototype.invoke = function() 
    { 
     if(Global.validate_input_on === 1) 
     { 
      if(!this.text_object.checkEmpty()) 
      { 
       this.message_object.display('empty'); 
       this.effects_object.fade('down', this.TIME); 
       return false; 
      } 
      switch(this.type) 
      { 
       case 'signin': 
        if(!this.text_object.checkPattern('email')) 
        { 
         this.message_object.display('email'); 
         this.effects_object.fade('down', this.TIME); 
         return false; 
        } 
        if(!this.text_object.checkPattern('pass')) 
        { 
         this.message_object.display('pass'); 
         this.effects_object.fade('down', this.TIME); 
         return false; 
        } 
        break; 
       case 'signup': 
        if(!this.text_object.checkPattern('email')) 
        { 
         this.message_object.display('email'); 
         this.effects_object.fade('down', this.TIME); 
         return false; 
        } 
        if(!this.text_object.checkPattern('name')) 
        { 
         this.message_object.display('name'); 
         this.effects_object.fade('down', this.TIME); 
         return false; 
        } 
        if(!this.text_object.checkPattern('pass')) 
        { 
         this.message_object.display('pass'); 
         this.effects_object.fade('down', this.TIME); 
         return false; 
        } 
        break; 
       case 'tweet': 
        if(!this.text_object.checkPattern('tweet')) 
        { 
         this.message_object.display('tweet'); 
         this.effects_object.fade('down', this.TIME); 
         return false; 
        } 
        break; 
       default: 
      } 
     } 
     var response_element = this.response_element; 
     if(this.type === 'tweet') { var fill_element = this.fill_element; } 
     new Ajax().invoke(serializeArray(this.form_element) + '&ajax_type=' + this.type + '_control', function(server_response_text) { ajaxType(server_response_text, response_element, 'respond', fill_element); }); 
    }; 
    Control.tweet = function() 
    { 
     new Control('tweet').invoke(); 
    } 
    Control.in = function() 
    { 
     new Control('signin').invoke(); 
    }; 
    Control.up = function() 
    { 
     new Control('signup').invoke(); 
    }; 
    Control.out = function() 
    { 
     new Ajax().invoke('&ajax_type=ControlSignOut', function(server_response_text) { ajaxType(server_response_text, 0, 'simple'); }); 
    }; 
    Control.try = function() 
    { 
     new Ajax().invoke('&ajax_type=ControlTryIt', function(server_response_text) { ajaxType(server_response_text, 0, 'simple'); }); 
    }; 
    Control.bookmarkDelete = function(event_pull) 
    { 
     event_pull.preventDefault(); 
     domBookmarkDelete(this); 
     new Ajax().invoke(encodeURIComponent(this.name) + "=" + encodeURIComponent(this.innerHTML) + '&ajax_type=ControlBookmark_delete', function() { }); 
    } 
    return Control; 
}()); 
+0

이것은 매력적인 질문입니다. 내가 가지고있는 문제는 토론의 주제가 더 많으므로 한 가지 '올바른'답변이 될 가능성이 거의 없다는 것입니다. 따라서 스택 오버 플로우에 대한 [오프 주제] (http://stackoverflow.com/faq#dontask)입니다. 아마도 [프로그래머] (http://programmers.stackexchange.com/)가 더 좋은 집일 수 있습니까? –

+0

나는 주관적이고 프로그래머와 스펙에 의해 결정되는 라인이 올바른 대답이라고 말할 것이다. 객관적이지 않은 주관적인 것으로 정의하는 것은 내가 생각한 것을 검증 할 때 나를위한 대답이다. 아무도 들어오지 않았고 어떤 의미에서 정답이라고 대답했습니다. –

+0

나는 간단한 규칙이있다. 코드를 변경하기가 더 어렵게 만들려고한다면 내가 그렇게하는 이유는 그렇게하지 않는 것보다 더 나은 돈을 버는 .... –

답변

2

이것은 코드를 통합 할 때 모든 사람이 자신의 개인적 취향을 가질 것이라는 점에서 꽤 주관적인 질문이며 프로젝트마다 다를 수 있으므로 현지화되어 있습니다. 즉, 모든 것이 하나의 거대한 것으로 통합되기를 원하지 않기 때문에 분명히 그려지는 라인이 있습니다. main() 모든 것을 처리 한 다음 일부를 처리하는 기능.

당신을 도움이 엄지 손가락의 두 프로그램 규칙이 있습니다

  1. DRY

이제

  • 조기 최적화 === 악을 (자신을 반복하지 마십시오), 건조가 원칙은 합리적인 경우 유사한 코드를 재사용 가능한 모듈에 결합해야한다는 것입니다. 여기에있는 키워드는 비슷한 코드입니다. 반복되는 코드의 위험에 처해 있어도 여러 개의 개별 모듈을 사용하는 것이 의미가 있습니다. 그 이유는 DRY라는 이름으로 다른 모듈을 통합하기 시작하면 코드 유지 관리와 가독성을 고려해야하며 가독성 악몽이 될 수 있기 때문입니다.

    아이디어가 너무 작고 코드 복잡성이 많으므로 조기 최적화에 대해서도 언급했습니다. 나는 당신이 그것에 대해 잊어 버리고 압축/gzipping에 코드 발자국을 남길 것을 제안합니다.

    마지막으로 질문에 대답하려면 모듈을 개인적으로 결합해야합니다. 그러나 그 코드를 유지해야하는 사람은 궁극적으로 결정해야합니다. 나중에이 달을 다시 방문 할 때 어둠 속에서 길을 잃지 않도록 모든 것을 적절하게 설명하고 문서화하는 것을 잊지 마십시오.

  • 1

    코드 우를 uld는 당신이 원하는, 읽기 쉽고, 테스트 할 수있는 결과를 만들어 낼 수 있으며, 언어와 관계없이의 요구 성능이 입니다.

    당신은 주관적인 "가독성"과 불필요한 "절대적으로 가장 빠른"사이의 트레이드 오프를 찾으려고합니다. 나는 말하고 싶습니다. 당신이 회의에 문제가없는 한, 요구되는 성능 (측정/목표를 먼저 가져야 함 ...)과 관련하여 문제가 발생하지 않는다면 무엇이든지 읽을 수 있습니다.

    1

    답변은 상속입니다. 공통 부분을 가져 와서 상위 클래스에 넣은 다음 상속하십시오. 다른 호출에 대해 if 문을 여러 개 넣는 것은 상속 해킹과 같습니다. JS에서이 작업을 수행하는 방법을 배우면 코드를 게시합니다.