2012-03-26 9 views
7

व्यावहारिक प्रोग्रामिंग सिद्धांतों को रखने की कोशिश कर रहा है, मैं निर्णय लेने का प्रयास कर रहा हूं कि "बताओ, पूछो मत" सिद्धांत के आधार पर उपयोगकर्ता पासवर्ड परिवर्तनों को कैसे संभाला जाए।बताएं, सिद्धांत और पासवर्ड की समाप्ति न पूछें

मेरे पास एक उपयोगकर्ता ऑब्जेक्ट है जिसका पासवर्ड हर 30 दिनों में समाप्त हो जाता है। यदि पासवर्ड समाप्त हो गया है तो मुझे पासवर्ड समाप्त होने/पासवर्ड दृश्य बदलने में सक्षम होना चाहिए। ऑब्जेक्ट से पूछना कि पासवर्ड समाप्त हो गया है (यह राज्य है) और फिर कौन सा दृश्य दिखाना है, सिद्धांत के उल्लंघन की तरह लगता है।

इस स्थिति को संभालने का सबसे अच्छा तरीका क्या है?

+1

पासवर्ड समाप्त करना एक बेवकूफ चीज है। लोग सिर्फ क्रैपी का उपयोग करते हैं क्योंकि वे * अपने * जटिल को याद रखने में कामयाब होते हैं जब उन्हें फिर से बदलना पड़ता है। – ThiefMaster

+0

पीसीआई अनुपालन आपके साथ असहमत – Hupperware

+0

@ हूपरवेयर जो आंकड़े :-p – jnm2

उत्तर

3

जब आप पासवर्ड प्रमाणीकृत होते हैं, तो उपयोगकर्ता ऑब्जेक्ट से पासवर्ड अपवादित अपवाद फेंक सकते हैं, या जो भी फ़ंक्शन आप उपयोगकर्ता पर पहले कॉल करते हैं।

+0

लेकिन यह एक और सिद्धांत तोड़ रहा है - अपवादों का उपयोग करके प्रवाह को नियंत्रित न करें। कालबाह्य पासवर्ड एक असाधारण स्थिति नहीं है। – NOtherDev

+0

आपको नियंत्रण प्रवाह के लिए अपवादों का उपयोग नहीं करना चाहिए - वे महंगे हैं –

+0

अच्छे अंक, धन्यवाद। हालांकि अगर आप 'बताओ, पूछो मत' से चिपकना चाहते हैं तो आप अपवादों के बिना इसे कैसे संभालेंगे? समारोह से एक राज्य लौटें? – GavinCattell

3

आपको या तो उपयोगकर्ता ऑब्जेक्ट को वैध() विधि पर विचार करना चाहिए जो एक बूलियन प्रदान करता है (सदस्यता प्रदाता अनुबंध की तरह) या वैध() विधि को किसी प्रकार की गणना वापस करने पर विचार करें जो सत्यापन के परिणाम को इंगित करता है (ठीक है, INVALID_PASSWORD, EXPIRED_PASSWORD, आदि)।

बहुत सारे विकल्प हैं - यदि पासवर्ड समाप्त हो गया है तो अपवाद फेंकना उनमें से एक नहीं होना चाहिए। यह खराब फॉर्म है और एक प्रदर्शन हिट भी है क्योंकि रनटाइम को स्टैक को खोलना है।

+0

मैंने कभी इस तर्क को नहीं समझा ... ढेर खुद को अनदेखा करने में बहुत अच्छा है। ऐसा करने के लिए इसका मतलब है। – DanDan

+0

एक परीक्षण करें। एक कंसोल ऐप लिखें जो अपवाद फेंकता है और कंसोल को आउटपुट लिखता है। डीबग मोड में इसे चलाएं। ध्यान दें कि आपके अपवाद को फेंकने और प्रदर्शित करने में कितना समय लगता है। जब आप अपवाद फेंकते हैं तो बहुत कुछ चल रहा है - यह महंगा है। मैं यह भी समझता हूं कि रिलीज मोड में चलने से डीबगिंग भी धीमी है, लेकिन जब भी आप अपवाद फेंकते हैं तो बहुत कुछ चल रहा है। –

+0

यह ठीक है ... जब मैं साथ आता हूं तो मैं अपने अपवाद ऑब्जेक्ट को संभालेगा, मैं इस मुद्दे से निपटने के लिए सबसे अच्छी जगह में रहूंगा क्योंकि यह समृद्ध जानकारी से भरा है। मुझे वास्तव में परवाह नहीं है कि यह निर्माण के लिए कुछ अतिरिक्त नैनोसेकंड लेता है। – DanDan

1

मैं व्यक्तिगत रूप से वापसी के मूल्यों/Enum प्रकारों को प्रोग्राम करना पसंद नहीं करता हूं। आपके पास जितना अधिक रिटर्न प्रकार है, उतना अधिक पथ आपको परीक्षण/काम करने के लिए है। इसके अलावा, प्रवाह को नियंत्रित करने के लिए अपवादों का उपयोग करना एक बुरा अभ्यास है (जब तक कि आप वास्तव में कोई अन्य विकल्प नहीं ढूंढ पाते - लेकिन आमतौर पर एक बेहतर होता है)।

एक कालबाह्य पासवर्ड मेरे लिए वास्तव में असाधारण नहीं है। यह सब के बाद एक वैध स्थिति है (या फिर आप सभी के लिए पासवर्ड समाप्त होने के खिलाफ कुछ करेंगे)

मैं इसे सरल रखने की कोशिश करता हूं और या तो bool या Func<T> जैसे कुछ को वापस कॉलर द्वारा सीधे बुलाया जा सकता है।

शायद ऐसा ही कुछ:

public class User 
    { 
     private DateTime _lastChangeDate; 
     public Action Validate() 
     { 
      if (_lastChangeDate >= DateTime.Now.AddDays(-30)) 
      { 
       return new Action(() => this.Login()); 
      } 
      else 
      { 
       return new Action(() => this.ChangePassword()); 
      } 
     } 
     private void Login() 
     { 
      Console.WriteLine("Login"); 
     } 
     private void ChangePassword() 
     { 
      Console.WriteLine("Change Password"); 
     } 
    } 

फोन करने वाले की तरफ:

user.Validate().Invoke(); 
4
login 
    model.validate(); 
    return model.show(self); 

passwordExpired() 
    return View("ChangePassword") 

loginSuccess() 
    return View("default") 

class User 
    show(aController) 
     if passwordExpired 
      return aContoller.passwordExpired() 
    else return aContoller.loginSuccess() 

बताओ, पूछो मत करो, कोई अपवाद नहीं है, और यह Demeter

के कानून का अनुसरण करता है
0

इसे हल करने का एक तरीका एक ओओ मॉडलिंग जैसा है:

public class Login { 

private String userName; 
private String password; 
private Date expirationDate;  

public void authenticate(String password) { 
    if (this.password.equals(password) { 
     redirectoToMainOrEditPage(); 
    } else { 
     redirectToFailPage(); 
    } 
} 

private void redirectToMainOrEditPage() { 
    Date today = new Date(); 

    if (today.before(expirationDate)) { 
     redirectToMainPage(); 
    } else { 
     redirectToEditPage(); 
    } 
} 

private void redirectToMainPage() { 
    ... 
} 

private void redirectToEditPage() { 
    ... 
} 

private void redirectToFailPage() { 
    ... 
} 

public void changePassword(String newPassword) { 
    ... 
} 

public void changeExpirationDate(Date newDate) { 
    ... 
} 
} 

इस तरह आप अन्य डोमेन ऑब्जेक्ट्स से कुछ भी नहीं पूछते हैं, लेकिन प्रमाणीकरण के लिए लॉगिन बताएं, क्योंकि इसमें सब कुछ करने के लिए आवश्यक है।

संबंधित मुद्दे

 संबंधित मुद्दे