Forked from franreyes/gist:8f8d24a9d5c6848b39eb7b667f3c49cd
Last active
June 30, 2024 13:08
-
-
Save trikitrok/0d92fffaadbbf647f6f2a36ed2008695 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class BankAccount { | |
public void Spend(double amount) { ... } | |
} | |
/* ---- */ | |
class OneClient { | |
... | |
bankAccount.Spend(amount); | |
... | |
} | |
/* ---- */ | |
class OtherClient { | |
... | |
bankAccount.Spend(amount); | |
... | |
} | |
/* new changes => log expenses that exceed 1000 euros in a text file */ | |
// Refactor step 1 | |
class BankAccount { | |
// ... | |
public BankAccount(...) { // used by clients in production code | |
// ... | |
} | |
public void Spend(double amount) { // used by clients in production code | |
// ... | |
LogExpense(amount); | |
} | |
private void LogExpense(double amount) { | |
} | |
} | |
// Refactor step 2 | |
class BankAccount { | |
//... | |
public BankAccount(...) { // used by clients in production code | |
// ... | |
_expenseLogger = new NoExpenseLogger(); | |
} | |
public void Spend(double amount) { // used by clients in production code | |
// ... | |
LogExpense(amount); | |
} | |
private void LogExpense(double amount) { | |
_expenseLogger.Log(amount); | |
} | |
} | |
class NoExpenseLogger { | |
public void Log(double amount) { } | |
} | |
// Refactor step 3 | |
class BankAccount { | |
// ... | |
public BankAccount(...) { // used by clients in production code | |
// ... | |
_expenseLogger = new NoExpenseLogger(); | |
} | |
public BankAccount(..., ExpenseLogger expenseLogger) { // not used yet by clients in production code, used in tests | |
// ... | |
_expenseLogger = expenseLogger; | |
} | |
public void Spend(double amount) { // used by clients in production code | |
// ... | |
LogExpense(amount); | |
} | |
private void LogExpense(double amount) { | |
_expenseLogger.Log(amount); | |
} | |
} | |
class NoExpenseLogger : ExpenseLogger { | |
public void Log(double amount) { } | |
} | |
interface ExpenseLogger { | |
void Log(double amount) | |
} | |
class BigExpenseLogger : ExpenseLogger { // used only in tests | |
/// ... | |
BigExpenseLogger(Logger logger, double threshold) { | |
_logger = logger; | |
_threshold = threshold; | |
} | |
public void Log(amount) { | |
if(amount > _threshold) { | |
_logger.Log("Big expense!! " + amount); | |
} | |
} | |
} | |
// Final state: new feature working | |
class BankAccount { | |
/// ... | |
public BankAccount(..., ExpenseLogger expenseLogger) { // used by clients in production code | |
// ... | |
_expenseLogger = expenseLogger; | |
} | |
public void Spend(double amount) { // used by clients in production code | |
// ... | |
_expenseLogger.Log(amount); | |
} | |
} | |
class BigExpenseLogger : ExpenseLogger { // used by clients in production | |
/// ... | |
BigExpenseLogger(Logger logger, double threshold) { | |
_logger = logger; | |
_threshold = threshold; | |
} | |
public void Log(amount) { | |
if(amount > _threshold) { | |
_logger.Log("Big expense!! " + amount); | |
} | |
} | |
} | |
interface ExpenseLogger { | |
void Log(double amount) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment