2012-04-10 4 views
0

TROCKEN - Wiederholen Sie sich nichtCodierung DRY, wie gemeinsame Funktionalität in diesen beiden Objekten zu kombinieren?

ControlSignUp und ControSignIn sind nahezu identisch. Ich habe ein "hier" auf den nur 4 Zeilen kommentiert, die unterschiedlich sind. Wie kann ich diese allgemeine Funktionalität kombinieren?

Eigentlich scheint es offensichtlich .. Ich kann nur in einer einzigen Variablen durch den Konstruktor übergeben ... nur eine Sekunde.

Antwort:

/** 
*  ControlSign 
*/ 

var ControlSign = function(type) 
{ 
    var form_element = document.getElementById(type); 
    var response_element = document.getElementById(type + '_response'); 
    var text_object = new Text(form_element); 
    var message_object = new Message(response_element); 

    this.invoke = function() 
    { 
     if(Global.validate_input_on === 1) 
     { 
      if(!text_object.checkEmpty()) 
      { 
       message_object.display('empty'); 
       return false; 
      } 
      if(type === 'signup' && !text_object.checkPattern('name')) 
      { 
       message_object.display('name'); 
       return false; 
      } 
      if(!text_object.checkPattern('email')) 
      { 
       message_object.display('email'); 
       return false; 
      } 
      if(!text_object.checkPattern('pass')) 
      { 
       message_object.display('pass'); 
       return false; 
      } 
     } 
     AjaxNew.repeatUse(ajaxSerialize(form_element) + '&ajax_type=' + type + '_control', function(server_response_text) { ajaxType(server_response_text, response_element, 'respond'); }); 
    } 
}; 

ControlSign.in = function() 
{ 
    new ControlSignIn('signin').invoke(); 
}; 
ControlSign.up = function() 
{ 
    new ControlSignUp('signup').invoke(); 
}; 
+1

Eine der Return-Anweisungen ist 'return;' anstatt 'return false' - Bug oder Feature? –

+1

Sie haben vielleicht die Sekunde gewartet, bevor Sie gefragt haben :-) – Bergi

+1

Was soll ich als Kommentar eingeben? Edit: Moment mal, ich hab's! – MarioDS

Antwort

2

Einfache Lösung: Machen Sie es eine Funktion ControlSign mit einem Parameter, mit "in" oder "up" aufgerufen. Sie könnten dieses "Fabrikmuster" nennen.

Komplexe Lösung: Sie verwenden eine Funktion Funktion, um die zwei Konstruktoren zu erstellen. OK, was bedeutete, dass ich die Verwendung eines Verschluss Konstrukteuren zu erstellen:

function makeControlSign(type) { 
    function constructor(...) { 
     this.invoke = function(){...}; 
     // use the variable "type" where needed 
     ... 
    } 
    constructor[type] = function(){...}; 
    return constructor; 
} 
var ControlSignUp = makeControlSign("up"); 
var ControlSignIn = makeControlSign("in"); 

Ich denke, das weder „Fabrikmuster“ genannt werden sollte, noch „Abstrakte Fabrik“.

+0

Link zu javaScript Factory-Funktion? –

+0

Es gibt viele js-Einführung in "Factory-Methoden" im Internet. Obwohl ich Angst habe, dass ich den Begriff missbrauche :-( – Bergi

+0

Ich habe von der Fabrik Muster gehört..Ich obwohl Sie etwas Neues erfunden. –

Verwandte Themen