Menyelam ke Injeksi Ketergantungan (DI), atau Cara Menghancurkan Matriks

Dahulu kala di Galaksi yang jauh, ketika saudara perempuan Wachowski masih bersaudara, kecerdasan buatan dalam pribadi Arsitek memperbudak umat manusia dan menciptakan Matriks ... Halo semuanya, ini Maxim Kravets dari Holyweb lagi, dan hari ini saya ingin berbicara tentang Injeksi Ketergantungan, yaitu tentang injeksi ketergantungan, atau hanya DI. Untuk apa? Mungkin Anda hanya ingin merasa seperti Morpheus, mengatakan sakramental: "Saya tidak bisa menjelaskan kepada Anda apa DI itu, saya hanya bisa menunjukkan kebenaran."  





Rumusan masalah

Sini. Lihatlah burung-burung ini. Ada program untuk mengelolanya. Program lain mengontrol pohon dan angin, matahari terbit dan terbenam. Program-program sedang diperbaiki. Mereka semua melakukan bagian pekerjaan mereka sendiri.





pythia





, , โ€”  , . , . โ€”  ? , . , ?





? , , , .





, , .





? , (, ), (Injection) , , , . 





, , : , ? โ€” (Dependency) .





? โ€” . Dependency Injection โ€” . โ€” , ? 





, : ยซ ยป. โ€” . . ? . 





, - โ€” , ! 





. , , , ! โ€” , .





, . , , . DI โ€” . . matrix, , . , , , , , , whoWin():





class Matrix {
  agent = {
    name: 'Smith',
    damage: 10000,
  };

  human = {
    name: 'Cypher',
    damage: 100,
  };

  whoWin(): string {
    const result = this.agent.damage > this.human.damage
      ? this.agent.name
      : this.human.name;
    return result;
  }
}

const matrixV1 = new Matrix();
console.log(โ€˜ โ€™, matrixV1.whoWin());
      
      



, , , .





  Smith
      
      



, , , , - โ€” . , , . โ€” . , . .





class Human {
  name;
  damage;

  constructor(name, damage) {
    this.name = name;
    this.damage = damage;
  }

  get name(): string {
    return this.name;
  }

  get damage(): number {
    return this.damage;
  }
}

class Matrix {
  agent = {
    name: 'Smith',
    damage: 10000,
  };
 human;

  constructor(challenger) {
    this.human = challenger;
  }

  whoWin(): string {
    const result = this.agent.damage > this.human.damage
      ? this.agent.name
      : this.human.name;
    return result;
  }
      
      



Human, , . โ€” . , ?





const Trinity = new Human('Trinity', 500);
const matrixV1 = new Matrix(Trinity);
console.log(' ', matrixV1.whoWin());
      
      



, ยซ ยป (), , , .





  Smith
      
      



! , ? , Matrix Human! , , , !





class Human {
 โ€ฆ
  get damage(): number {
    return this.damage * 1000;
  }
}
      
      



...





?

? , Matrix challenger, , damage, . , , ! โ€” . ? , damage, power? strength?





! Dependency inversion principle, (DIP). , , , ยซยป , Dependency inversion (DI), .





, :





  1. . .





  2. . .





? , , , .





Matrix AbstractHuman, Human โ€” :





abstract class AbstractHuman {
  abstract get name(): string;
  abstract get damage(): number;
}

class Human implements AbstractHuman{
  name;
  damage;

  constructor(name, damage) {
    this.name = name;
    this.damage = damage;
  }

  get name(): string {
    return this.name;
  }

  get damage(): number {
    return this.damage;
  }
}


class Matrix {
  agent = {
    name: 'Smith',
    damage: 10000,
  };
 human;

  constructor(challenger: AbstractHuman) {
    this.human = challenger;
  }

  whoWin(): string {
    const result = this.agent.damage > this.human.damage
      ? this.agent.name
      : this.human.name;
    return result;
  }
}

const Morpheus = new Human('Morpheus', 900);
const matrixV2 = new Matrix(Morpheus);
console.log(' ', matrixV2.whoWin());
      
      



, โ€” .





  Smith
      
      



, ? Matrix Human โ€” . Human , โ€” ยซยป AbstractHuman () , . .





, ! , , โ€” โ€ฆ , .





      Smith
      Smith
      
      



, , , . , :





...
class TheOne implements AbstractHuman{
  name;
  damage;

  constructor(name, damage) {
    this.name = name;
    this.damage = damage;
  }

  get name(): string {
    return this.name;
  }

  get damage(): number {
    return this.damage * 1000;
  }
}
โ€ฆ
const Neo = new TheOne('Neo, 500);
const matrixV5 = new Matrix(Neo);
      
      



!





      
      
      



, ? Matrix, Human, . . โ€” . 





, , , , . , , !





, , โ€” Inversion of Control (IoC). 





, , (, ) (, ). ( ) โ€” . 





, DIP ( ) โ€” IoC.





- -?

โ€”  . , singleton multiton โ€” (), (). 





, .





  • ,





  • , ,





  • ( ),





  • , , .





: - / (Service Locator), - DI, IoC Container. .





, (). , . Angular โ€”  Injectable.





@Injectable()
export class SomeService {}
      
      



IoC . 





SomeService, , . 





-, โ€”

โ€”  , . , , . , ยซยป , , . , , .





โ€”  , ยซ ยป ยซ - ยป. , . new, ยซยป, , .





, ?

, ยซยป - , IoC?  





1 โ€” .





  • , -. 





  • DI. .





  • , .





  • โ€” , , ยซยป, โ€” IoC . 





2 โ€” .





  • โ€” , -.





  • โ€” , Y. 





  • , Y , X.





  • โ€” , , . .





3 โ€” .





  • โ€” .





  • production โ€” ยซยป .





  • โ€” , .





  • โ€” , , .





, , , DI, . . โ€”  , . , , , DI. 





Jika Anda memiliki pertanyaan atau tambahan tentang topik ini, saya akan dengan senang hati melanjutkan komunikasi di komentar. Tulis, apa yang harus diceritakan di artikel selanjutnya? Dan jika Anda ingin mengenal kami lebih baik , saya selalu berhubungan di Telegram @maximkravec








All Articles