SOLID : 인터페이스 분리
14518 단어 typescriptarchitectureprogramming
Clients should not be forced to implement any methods they don't use
즉, 클라이언트(자녀)가 말하는 것과 같습니다.
😩😩 For what I need to implement this one??? I don't need it
이 고객(아이)의 민원을 하루빨리 막아야 합니다!!
👎 잘못된 코드
동물 인터페이스 설정
그런 다음 Dog 클래스와 Fish 클래스를 만듭니다.
interface IAnimal {
fly: () => void
run: () => void
swim: () => void
}
class Dog implements IAnimal {
// 😩😩😩 For what I need to implement it....
fly() {
null
}
run() {
console.log('running!!!!')
}
swim() {
console.log('swim!!! not so fast though')
}
}
class Fish implements IAnimal {
fly() {
console.log('fly... a little?')
}
// 😩😩😩 For what I need to implement it....
run() {
null
}
swim() {
console.log('swim!! soooooooo fast!!!!!!!!!!')
}
}
이 코드에서 볼 수 있듯이 클래스는 For what I need to implement it...
개가 날지 않으니 물고기가 뛰지 않는다!!
👍 좋은 코드
// ⭐ divide interface !
interface IAnimalFly {
fly: () => void
}
interface IAnimalRun {
run: () => void
}
interface IAnimalSwim {
swim: () => void
}
class Dog implements IAnimalRun, IAnimalSwim{
run() {
console.log('dos runs !!')
}
swim() {
console.log('dos swims, not so fast though')
}
// ⭐ Dog doesn't need to implement fly()
}
class Fish implements IAnimalFly, IAnimalSwim {
fly() {
console.log('fish fies... a little?')
}
swim() {
console.log('fish swims so fast !!!!!')
}
// Fish doesn't need to implement run()
}
인터페이스를 나누어 주셔서 감사합니다. Dog and Fish는 마침내 전혀 불평하지 않습니다 ↓
For what I need to implement this one??? I don't need it
기사 Liskof 대체품의 Btw도 인터페이스를 나누는 것이 중요한 핵심이었습니다.
인터페이스의 아키텍처는 SOLID 원칙에서 중요하다고 생각합니다.
💎 프론트엔드 엔지니어용
프론트엔드 엔지니어를 위한 인터페이스 분리에 대한 좋은 샘플을 찾았으니 보여드릴께요
👎 잘못된 코드
Diary 앱이 있는데, 처음에는
type Diary
를 설정한 다음 updateDiaryTitle
기능을 만듭니다.export type Diary = {
id: string;
title: string;
content: string;
createdAt: Date;
updatedAt: Date;
};
const updateDiaryTitle = async (
// ⭐ here get Diary object
diary: Diary,
updateTitle: (props: {id: string, title: string}) => Promise<void>
): Promise<void> => {
// fetch data from server
await updateTitle({ id: task.id, title: task.title });
};
지금은 문제가 있습니다. 누군가 이렇게 변경하면
Diary type
type Diary = {
id: string;
diaryInfo: {
// ⭐ title is inside diaryInfo now !!
title: string;
details: string;
},
createdAt: Date;
updatedAt: Date;
};
그것 때문에 오류가 발생합니다
const updateDiaryTitle = async (
diary: Diary,
updateTitle: (props: {id: string, title: string}) => Promise<void>
): Promise<void> => {
await updateTitle({ id: task.id, title: task.title });
// => 🔥🔥🔥 Property 'title' does not exist on type 'Diary'.
};
updateDiaryTitle
를 수정해야 하지만 Diary
유형에 의존해서는 안 됩니다. 좋은 코드는 다음과 같습니다.👍 좋은 코드
const updateDiaryTitle = async (
// ⭐⭐⭐ get "id" and "diary" directly
diary: {id: string, diary: string},
updateTitle: (props: {id: string, title: string}) => Promise<void>
): Promise<void> => {
await updateTitle({ id: diary.id, title: diary.title });
};
id
및 diary
를 직접 가져오면 updateDiaryTitle
함수에서 어떤 속성을 사용해야 하는지 명확하게 알 수 있습니다.그런 다음
updateDiaryTitle
를 구현하거나 수정할 때 Diary
유형에 대해 전혀 신경 쓸 필요가 없습니다.React.js 또는 Vue.js에서 props를 자식에게 전달하는 것을 확실히 보았고 보게 될 것입니다 😀 언젠가는 이 원칙을 효과적으로 사용하기를 바랍니다 👍
심판
https://kanoe.dev/blog/interface-segregation-principle/
japanese blog
Reference
이 문제에 관하여(SOLID : 인터페이스 분리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kaziusan/solid-interface-segregation-d5i텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)