如何成为一个更好的程序员?设计原则I:KISS,DRY...( 三 )

我们拥有AccountService , 它负责多项工作:记录 , 验证和操作用户余额 。同样 , 未实施TDA 。我们应该分开验证并创建外部记录器 , 以备将来在其他模块中使用 。
适当的SoC的示例:
/** * VALIDATORS */class StringLengthValidator {static greaterThan(value: string, length: number): boolean {if ( value.length > length){return true} else {throw new Error("String is not long enough.");}}}class UserBalanceValidator {static haveEnoughFunds(user: User, amount: number): boolean {return (user.getBalance() - amount) > 0;}}/** * INTERFACES */interface IUserAccount {_id: string;name: string;balance: number;}/** * CLASSES */class User implements IUserAccount {_id: string = '';name: string = '';balance: number = 0;constructor(name) {this._id = this._generateRandomID();this.setName(name);}private _generateRandomID() {return Math.random().toString(36).substring(7);}getId(): string {return this._id;}setName(name: string): User {StringLengthValidator.greaterThan(name, 2);this.name = name;return this;}getBalance(): number {return this.balance;}setBalance(amount: number): User {this.balance = amount;LoggerService.log("User " + this.getId() + " now has " + this.getBalance() );return this;}}class LoggerService {static log(message: string): string {message = (new Date()) + " :: " + message;console.log(message);return message;}}class AccountService {transfer(fromUser: User, toUser: User, amount: number): any {if (!UserBalanceValidator.haveEnoughFunds(fromUser, amount)) {LoggerService.log("User " + fromUser.getId() + " has not enough funds.");return {fromUser, toUser};}fromUser.setBalance(fromUser.getBalance() - amount);toUser.setBalance(toUser.getBalance() + amount);return {fromUser, toUser}}updateBalance(user: User, amount: number) : User {user.setBalance(user.getBalance() + amount);return user;}}const aService = new AccountService();let u1 = new User("john");let u2 = new User("bob");u1 = aService.updateBalance(u1, 1000);u2 = aService.updateBalance(u2, 500);console.log( aService.transfer(u1, u2, 250) );现在我们每个类都有各自的状态和功能:验证器 , 用户 , AcocuntService和LoggerService 。由于SoC , 我们可以在应用程序的许多不同模块中分别使用它 。而且 , 由于存在逻辑的位置较少 , 因此该代码更易于维护 。
YAGNI:您将不需要它该原则不是在告诉我们如何直接在代码中执行某些操作 , 而是告诉我们如何有效地进行编码 。总的说来 , 我们应该只编写在特定时刻需要我们编写的内容 。例如:当我们必须对电子邮件和密码字段进行验证时 , 我们不应该对名称进行验证 , 因为我们可能永远不需要它 。确实是TDD:我们仅针对微功能编写测试 , 并为此编写最少的代码 。" YAGNI"正试图节省我们的时间 , 专注于冲刺中最重要的事情 。
那就是所有的内容我希望通过这篇文章 , 您学到了一些东西 , 或者提醒了您已经知道的一些东西 。:)
 


【如何成为一个更好的程序员?设计原则I:KISS,DRY...】


推荐阅读