純粋な関数が 1ということです。
- ウィル常に同じ引数与えられた同じ結果を与えます
- 目に見える副作用はありません(例:状態の変化)
ユーザーログインを処理するコードを記述しているとします。ここでは、指定されたユーザー名とパスワードが正しいことを確認し、失敗した試行が多すぎる場合にユーザーがログインできないようにします。命令型では、コードは次のようになります。
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
組み合わせに対して常に同じ結果を与えるとは限りません。
- 関数はデータベースの状態を変更できます。つまり、副作用があります。
また、この機能ユニットテストするために、我々は2つのデータベース・コールをモックする必要があることに注意してください、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
純粋な関数であるため、外部の依存関係を模擬する必要なく、コアユーザー認証ロジックを単体テストできることに注意してください。これは、データベースとの対話が呼び出しスタックの上位で処理されるためです。