Skip to content

Instantly share code, notes, and snippets.

@isaacbatst
Created October 21, 2022 16:48
Show Gist options
  • Save isaacbatst/00361d4209daa4c35c012426c4b5f66d to your computer and use it in GitHub Desktop.
Save isaacbatst/00361d4209daa4c35c012426c4b5f66d to your computer and use it in GitHub Desktop.
  • 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 de MiddleEarthPeople, permitindo-os serem reutilizados em outros contextos, como em uma loja de equipamentos por exemplo.
    • 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);
        //   }
        // }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment