एक शुद्ध कार्य यह है कि:
- विल हमेशा एक ही तर्क दिया एक ही परिणाम दे
- कोई भी देखने योग्य साइड इफेक्ट नहीं है (जैसे राज्य परिवर्तन)
मान लीजिए कि हम उपयोगकर्ता लॉगिन को संभालने के लिए कुछ कोड लिख रहे हैं, जहाँ हम यह जाँचना चाहते हैं कि आपूर्ति किया हुआ उपयोगकर्ता नाम और पासवर्ड सही हैं और यदि बहुत अधिक विफल प्रयास हैं, तो उपयोगकर्ता लॉगिंग को रोकें। एक अनिवार्य शैली में हमारा कोड इस तरह दिख सकता है:
bool UserLogin(string username, string password)
{
var user = _database.FindUser(username);
if (user == null)
{
return false;
}
if (user.FailedAttempts > 3)
{
return false;
}
// Password hashing omitted for brevity
if (user.Password != password)
{
_database.RecordFailedLoginAttempt(username);
}
return true;
}
यह बहुत स्पष्ट है कि यह एक शुद्ध कार्य नहीं है:
- यह फ़ंक्शन हमेशा दिए गए
username
और password
संयोजन के लिए समान परिणाम नहीं देगा क्योंकि परिणाम डेटाबेस में संग्रहीत उपयोगकर्ता रिकॉर्ड पर भी निर्भर करता है।
- फ़ंक्शन डेटाबेस की स्थिति को बदल सकता है, अर्थात इसके दुष्प्रभाव हैं।
यह भी ध्यान रखें कि इस फ़ंक्शन को यूनिट टेस्ट करने के लिए हमें दो डेटाबेस कॉल्स को मॉक करने की आवश्यकता है, FindUser
और RecordFailedLoginAttempt
।
यदि हम इस कोड को अधिक कार्यात्मक शैली में रिफलेक्टर करते तो शायद हम कुछ इस तरह से समाप्त हो सकते:
bool UserLogin(string username, string password)
{
var user = _database.FindUser(username);
var result = UserLoginPure(user, password);
if (result == Result.FailedAttempt)
{
_database.RecordFailedLoginAttempt(username);
}
return result == Result.Success;
}
Result UserLoginPure(User user, string pasword)
{
if (user == null)
{
return Result.UserNotFound;
}
if (user.FailedAttempts > 3)
{
return Result.LoginAttemptsExceeded;
}
if (user.Password != password)
{
return Result.FailedAttempt;
}
return Result.Success;
}
ध्यान दें कि हालांकि UserLogin
फ़ंक्शन अभी भी शुद्ध नहीं है, UserLoginPure
फ़ंक्शन अब एक शुद्ध फ़ंक्शन है और परिणामस्वरूप मुख्य उपयोगकर्ता प्रमाणीकरण तर्क को किसी भी बाहरी निर्भरता का मज़ाक बनाने की आवश्यकता के बिना परीक्षण किया जा सकता है। ऐसा इसलिए है क्योंकि डेटाबेस के साथ इंटरेक्शन कॉल स्टैक को अधिक संभाला जाता है।