接口如何进入并解耦两个紧密耦合的方法?

时间:2018-06-04 13:37:08

标签: javascript typescript oop decoupling

我有以下代码,以帮助我解释我在解耦概念方面遇到的问题。

例如

;

async getSomething(id: number): Promise<boolean> {
 if(id === "111") {
  return true;
 }
 else {
  return false;
 }
}

someFunc(): void {
 let id="123";
 if (getSomething(id)) {
  console.log("do somthing special");
 }
 else {
  console.log("sleep");
 }
}

来自answer on other decoupling question

我们使用接口来解耦两个方法,但我很难想象两个方法之间的相互作用是相互独立的。

例如;

export namespace Special {
 export interface MagicDay {
  isMagic: boolean;
 }
}
...

async getSomething(id: number): Promise<Special.MagicDay> {
 if(id === "111") {
   // here what I think is different from before
   // we create an object which we store our boolean
   // so in some future we can the way we implement this function
   // it is ok because we still have the **isMagic** that **someFunc** needs
  return {isMagic: true};
 }
 else {
  return {isMagic: false};
 }
}

someFunc(): void {
 let id="123";
 let someDay = getSomething(id);
   // different is now
   // we receive an object 
   // so what happens in the backend we don't need to worry about it
   // as long as we have the **isMagic** returns here
   // but what makes this decoupling which we still need the value from 
   // get something
 if (someDay.isMagic) {
  console.log("do somthing special");
 }
 else {
  console.log("sleep");
 }
}

我在上面的代码*里面发表评论,我认为我最麻烦。

我读了这个article about why we should use decoupling并且我明白了为什么,但是当涉及到实施时,我对这个想法感到困扰,因为我一直认为脱钩是如何使一个独立于其他人但我们仍然需要输入使它工作?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

this answer中提出的要点不一定适用于TypeScript,因为TS使用structural typingdatabase: Database不必是Database符合Database类型的实例。他们已经没有紧密耦合了。只要DatabaseIDatabase类型相同,就不需要IDatabase

MagicDay界面并不能解耦这段代码。 boolean类型刚刚替换为{ isMagic: boolean }类型。如果一个方法属于同一个类,则将一个方法与另一个方法分离是没有意义的。可以解耦不相关的函数:

type TGetSomething = (id: number) => Promise<boolean>;

const getSomething: TGetSomething = async (id: number) => {
 if(id === "111") {
  return true;
 }
 else {
  return false;
 }
}

function async someFunc(callback: TGetSomething): Promise<void> {
 let id="123";
 if (await callback(id)) {
  console.log("do somthing special");
 }
 else {
  console.log("sleep");
 }
}

someFunc(getSomething);

如果这些函数实际上是方法,则应该在类级别执行解耦。在所提到的来源中,解耦主要被称为OOP原则。