昔遠い銀河では、ウォシャウスキー姉妹はまだ兄弟だった時に、建築家の一人で人工知能が人間を奴隷にし、マトリックスを作成し...こんにちは誰もが、これは、マキシムKravets再びHolywebから、今日私がしたいです依存性インジェクション、つまり依存性インジェクション、または単に DI について話してください。何のために?おそらくあなたはモーフィアスのように感じたいと思って、秘跡をこう言っているのかもしれません。
問題の定式化
ここに。これらの鳥を見てください。それらを管理するプログラムがあります。他のプログラムは、木と風、日の出と日没を制御します。プログラムは改良中です。彼らは皆、自分の仕事をしています。
ピシア
, , — , . , . — ? , . , ?
? , , , .
, , .
? , (, ), (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), .
, :
. .
. .
? , , , .
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.
このトピックについて質問や追加がある場合は、コメントで引き続きコミュニケーションをとらせていただきます。書いて、次の記事で何を伝えますか?また、私たちのことをもっと知りたい場合は、Telegram @maximkravecで常に連絡を取っています。