- Composição
-
Todos os povos da terra média, devem ter uma lista de equipamentos
- Equipamentos tem: nome e preço
- Uma pessoa da terra média começa sempre com:
- Adaga Enferrujada
- Custa 5 dinheiros
-
Implementação sem composição
import People from "./People"; export default class MiddleEarthPeople implements People { // public _name: string; // public _height: number; // protected _languages: string[]; // protected _skills: Record<string, string>; private equipments: { name: string, price: number }[] // constructor(name: string) { // this._name = name; // this._languages = ['Westron']; // this._height = parseFloat((Math.random() * (2.1 - 0.6) + 0.6).toFixed(2)); // this._skills = {}; this.equipments = [{ name: 'Adaga Enferrujada', price: 5 }] // } // get languages(): string[] { // return this._languages; // } // protected static getRandomHeight(min: number, max: number): number { // const random = (Math.random() * (max - min) + min).toFixed(2); // return parseFloat(random); // } // public printName(): void { // console.log(this._name); // } // }
-
Regra para equipamentos:
- Os preços não podem ser menores que 0.
-
Comparação
Sem composição vs Com composição
:- Sem a composição, ou seja, implementando essas regras diretamente no
MiddleEarthPeople
estamos acoplando as duas entidades (pessoas e equipamentos) - Com a composição conseguimos:
- Abstrair a lógica relacionada aos equipamentos, simplificando o código em
MiddleEarthPeople
- Desacoplar
Equipments
deMiddleEarthPeople
, permitindo-os serem reutilizados em outros contextos, como em uma loja de equipamentos por exemplo.
- Abstrair a lógica relacionada aos equipamentos, simplificando o código em
- Sem a composição, ou seja, implementando essas regras diretamente no
-
Implementação com composição
-
Equipment
export default class Equipment { private _name: string; private _price: number; constructor(name: string, price: number) { this._name = name; if (price <= 0) { throw new Error('INVALID_EQUIPMENT_PRICE'); } this._price = price; } }
-
MiddleEarthPeople
import Equipment from './Equipment'; // import { People } from './People'; // export default class MiddleEarthPeople implements People { // public _name: string; // public _height: number; // protected _languages: string[]; // protected _skills: Record<string, string>; private _equipments: Equipment[]; // constructor(name: string) { // this._name = name; // this._languages = ['Westron']; // this._height = parseFloat((Math.random() * (2.1 - 0.6) + 0.6).toFixed(2)); // this._skills = {}; const firstEquipment = new Equipment('Adaga Enferrujada', 5); this._equipments = [firstEquipment]; // } // get languages(): string[] { // return this._languages; // } // public static getRandomHeight(min: number, max: number): number { // const random = (Math.random() * (max - min) + min).toFixed(2); // return parseFloat(random); // } // public printName(): void { // console.log(this._name); // } // }
-
-
Created
October 21, 2022 16:48
-
-
Save isaacbatst/00361d4209daa4c35c012426c4b5f66d to your computer and use it in GitHub Desktop.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment