웹 프론트엔드 JS 튜토리얼 쉬운 코딩 예제를 통해 SOLID 설계 원리 이해하기

쉬운 코딩 예제를 통해 SOLID 설계 원리 이해하기

Jul 17, 2024 am 04:58 AM

Understanding SOLID design principles with easy coding examples

이 글에서는 각 개념을 쉽게 이해할 수 있도록 간단한 코드 예제와 함께 SOLID 디자인 원칙에 대한 명확하고 간결한 개요를 제공합니다.

SOLID는 소프트웨어 설계를 더욱 이해하기 쉽고 유연하며 유지 관리하기 쉽게 만들기 위한 5가지 설계 원칙 세트입니다.

목차

  • S — 단일 책임 원칙(SRP)
  • O — 개방-폐쇄 원칙(OCP)
  • L — 리스코프 대체 원칙(LSP)
  • I — 인터페이스 분리 원칙(ISP)
  • D - 종속성 반전 원칙(DIP)

이 원칙은 객체 지향 설계에 특히 유용하며 프런트엔드 및 백엔드 개발에 일반적으로 적용됩니다. 다음은 TypeScript의 코드 예제와 함께 각 SOLID 원칙에 대한 간략한 개요입니다.

S — 단일 책임 원칙(SRP)

클래스를 변경해야 하는 이유는 단 하나여야 합니다. 즉, 클래스에는 하나의 임무나 책임만 있어야 합니다.

이 원칙은 UI의 한 측면에 대한 변경이나 업데이트가 관련 없는 부분에 실수로 영향을 미치지 않도록 집중적인 접근 방식을 장려합니다.

// UserProfile.tsx
import React from 'react';

interface UserProfileProps {
  username: string;
  email: string;
}

const UserProfile: React.FC<UserProfileProps> = ({ username, email }) => {
  return (
    <div>
      <h2>{username}</h2>
      <p>{email}</p>
    </div>
  );
};

export default UserProfile;
로그인 후 복사

여기서 UserProfile은 사용자 정보 표시만 담당합니다.


O — 개방-폐쇄 원칙(OCP)

소프트웨어 엔터티는 확장을 위해 열려 있어야 하지만 수정을 위해 닫혀 있어야 합니다.

이 접근 방식을 사용하면 핵심 구성 요소가 안정적이고 변경되지 않고 유지되므로 새로운 기능을 추가할 때 의도하지 않은 부작용이 발생할 위험이 줄어듭니다.

// Alert.tsx
import React from 'react';

interface AlertProps {
  message: string;
}

const Alert: React.FC<AlertProps> = ({ message }) => {
  return <div className="alert">{message}</div>;
};

export default Alert;

// SuccessAlert.tsx
import React from 'react';
import Alert from './Alert';

const SuccessAlert: React.FC<{ message: string }> = ({ message }) => {
  return <Alert message={`Success: ${message}`} />;
};

export default SuccessAlert;
로그인 후 복사

원래 경고 구성 요소를 수정하지 않고도 SuccessAlert를 통해 경고를 확장할 수 있습니다.


L - 리스코프 대체 원리(LSP)

슈퍼클래스의 객체는 프로그램의 정확성에 영향을 주지 않고 서브클래스의 객체로 대체 가능해야 합니다.

간단히 말하면 기본 구성 요소나 모듈이 있는 경우 예기치 않은 문제를 일으키지 않고 기본 구성 요소 대신 파생 구성 요소를 사용할 수 있어야 합니다.

// BaseButton.tsx
import React from 'react';

interface BaseButtonProps {
  onClick: () => void;
  label: string;
}

const BaseButton: React.FC<BaseButtonProps> = ({ onClick, label }) => {
  return <button onClick={onClick}>{label}</button>;
};

export default BaseButton;

// IconButton.tsx
import React from 'react';
import BaseButton from './BaseButton';

interface IconButtonProps extends BaseButtonProps {
  icon: string;
}

const IconButton: React.FC<IconButtonProps> = ({ onClick, label, icon }) => {
  return (
    <BaseButton onClick={onClick} label={<span><i className={icon}></i> {label}</span>} />
  );
};

export default IconButton;
로그인 후 복사

IconButton은 애플리케이션의 정확성에 영향을 주지 않고 BaseButton 어디에서나 사용할 수 있습니다.


I — ISP(인터페이스 분리 원칙)

어떠한 클라이언트도 자신이 사용하지 않는 방법에 의존하도록 강요해서는 안 됩니다. 이는 특정 요구에 맞는 특정 인터페이스를 생성하는 것을 의미합니다.

즉, 하나의 큰 인터페이스를 만드는 대신 개별 구성 요소에 맞게 더 작고 집중된 인터페이스로 세분화합니다.

// interfaces.ts
export interface Flyable {
  fly(): void;
}

export interface Swimmable {
  swim(): void;
}

// Bird.ts
import { Flyable } from './interfaces';

class Bird implements Flyable {
  fly() {
    console.log('Bird is flying');
  }
}

// Fish.ts
import { Swimmable } from './interfaces';

class Fish implements Swimmable {
  swim() {
    console.log('Fish is swimming');
  }
}
로그인 후 복사

클래스가 필요한 것만 구현하도록 별도의 Flyable 및 Swimmable 인터페이스가 생성되었습니다.


D - 종속성 반전 원리(DIP)

상위 수준 모듈은 하위 수준 모듈이 아닌 추상화에 의존해야 합니다. 둘 다 추상화에 의존해야 합니다.

간단히 말하면 구성 요소가 서로 직접적으로 의존하는 대신 인터페이스나 추상 클래스에 의존하므로 코드가 변경 사항에 더 잘 적응할 수 있습니다.

// Logger.ts
export interface Logger {
  log(message: string): void;
}

export class ConsoleLogger implements Logger {
  log(message: string) {
    console.log(message);
  }
}

// UserService.ts
import { Logger } from './Logger';

class UserService {
  constructor(private logger: Logger) {}

  createUser(username: string) {
    this.logger.log(`User created: ${username}`);
  }
}

// App.ts
import { UserService } from './UserService';
import { ConsoleLogger } from './Logger';

const logger = new ConsoleLogger();
const userService = new UserService(logger);

userService.createUser('JohnDoe');
로그인 후 복사

여기서 UserService는 Logger 추상화에 의존하므로 UserService를 변경하지 않고도 로깅 메커니즘을 유연하게 변경할 수 있습니다.


이러한 SOLID 원칙은 강력한 프런트엔드 및 백엔드 애플리케이션 개발에 필수적인 유지 관리, 확장 및 리팩터링이 쉬운 소프트웨어를 만드는 데 도움이 됩니다.

위 내용은 쉬운 코딩 예제를 통해 SOLID 설계 원리 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

JavaScript로 문자열 문자를 교체하십시오 JavaScript로 문자열 문자를 교체하십시오 Mar 11, 2025 am 12:07 AM

JavaScript로 문자열 문자를 교체하십시오

jQuery 날짜가 유효한지 확인하십시오 jQuery 날짜가 유효한지 확인하십시오 Mar 01, 2025 am 08:51 AM

jQuery 날짜가 유효한지 확인하십시오

jQuery는 요소 패딩/마진을 얻습니다 jQuery는 요소 패딩/마진을 얻습니다 Mar 01, 2025 am 08:53 AM

jQuery는 요소 패딩/마진을 얻습니다

10 JQuery Accordions 탭 10 JQuery Accordions 탭 Mar 01, 2025 am 01:34 AM

10 JQuery Accordions 탭

10 JQuery 플러그인을 확인할 가치가 있습니다 10 JQuery 플러그인을 확인할 가치가 있습니다 Mar 01, 2025 am 01:29 AM

10 JQuery 플러그인을 확인할 가치가 있습니다

노드 및 HTTP 콘솔로 HTTP 디버깅 노드 및 HTTP 콘솔로 HTTP 디버깅 Mar 01, 2025 am 01:37 AM

노드 및 HTTP 콘솔로 HTTP 디버깅

사용자 정의 Google 검색 API 설정 자습서 사용자 정의 Google 검색 API 설정 자습서 Mar 04, 2025 am 01:06 AM

사용자 정의 Google 검색 API 설정 자습서

jQuery div에 스크롤 바를 추가합니다 jQuery div에 스크롤 바를 추가합니다 Mar 01, 2025 am 01:30 AM

jQuery div에 스크롤 바를 추가합니다

See all articles