Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save trikitrok/0d92fffaadbbf647f6f2a36ed2008695 to your computer and use it in GitHub Desktop.
Save trikitrok/0d92fffaadbbf647f6f2a36ed2008695 to your computer and use it in GitHub Desktop.
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