برنامه نویسی

Implementando Clean Architecture com TypeScript

Summarize this content to 400 words in Persian Lang
Clean Architecture یک فلسفه طراحی نرم افزار است که هدف آن ایجاد سیستم هایی است که نگهداری، آزمایش و درک آن آسان باشد. بر تفکیک مسئولیت‌ها تأکید می‌کند و تضمین می‌کند که هر بخش از سیستم یک مسئولیت واحد دارد. در این مقاله، نحوه پیاده‌سازی معماری پاک با استفاده از TypeScript را بررسی خواهیم کرد.

فهرست مطالب

مقدمه ای بر معماری پاک
اصول بنیادی
پیکربندی پروژه
ساختار پوشه
موجودیت ها
موارد استفاده کنید
رابط ها
چارچوب و درایورها
همه اش را بگذار کنار هم
نتیجه

مقدمه ای بر معماری پاک

معماری پاک که توسط رابرت سی مارتین (عمو باب) معرفی شده است، جدایی واضحی را بین بخش‌های مختلف یک سیستم نرم‌افزاری فراهم می‌کند. ایده اصلی این است که منطق اصلی کسب و کار را مستقل از عوامل خارجی مانند پایگاه های داده، UI یا چارچوب ها نگه دارید.

اصول بنیادی

استقلال: منطق کسب و کار باید مستقل از رابط کاربری، پایگاه داده یا سیستم های خارجی باشد.

آزمایش پذیری: تست سیستم باید آسان باشد.

تفکیک مسئولیت ها: قسمت های مختلف سیستم باید وظایف متفاوتی داشته باشند.

قابلیت نگهداری: نگهداری و تکامل سیستم باید آسان باشد.

پیکربندی پروژه

ابتدا اجازه دهید یک پروژه TypeScript راه اندازی کنیم. شما می توانید استفاده کنید npm یا yarn برای راه اندازی یک پروژه جدید

mkdir clean-architecture-ts
cd clean-architecture-ts
npm init -y
npm install typescript ts-node @types/node –save-dev

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک فایل ایجاد کنید tsconfig.json برای پیکربندی TypeScript

{
“compilerOptions”: {
“target”: “ES6”,
“module”: “commonjs”,
“outDir”: “./dist”,
“rootDir”: “./src”,
“strict”: true,
“esModuleInterop”: true
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساختار پوشه

یک پروژه با معماری تمیز به طور کلی دارای ساختار پوشه زیر است:

src/
├── entities/
├── usecases/
├── interfaces/
├── frameworks/
└── main.ts

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

موجودیت ها

نهادها منطق اصلی تجارت را نشان می دهند. آنها مهمترین بخش سیستم هستند و باید مستقل از عوامل خارجی باشند.

// src/entities/user.entity.ts
export class User {
constructor(id: string, public email: string, public password:string) {}

static create(email: string, password: string) {
const userId = uuid()
return new User(userId, email, password)
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

موارد استفاده کنید

موارد استفاده حاوی قوانین تجاری خاص برنامه است. آنها تعامل بین موجودیت ها و رابط ها را تنظیم می کنند.

// src/usecases/create-user.usecase.ts
import { User } from “../entities/user.entity”;
import { UsersRepository } from “../interfaces/users.repository”

interface CreateUserRequest {
email: string;
password: string;
}

export class CreateUserUseCase {
constructor(private userRepository: UserRepository) {}

async execute(request: CreateUserRequest): Promisevoid> {
const user = User.create(request.email, request.password)
await this.userRepository.save(user);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

رابط ها

اینترفیس ها قراردادهای بین موارد استفاده و دنیای بیرونی هستند. آنها می توانند شامل مخازن، خدمات یا هر سیستم خارجی باشند.

// src/interfaces/users.repository.ts
import { User } from “../entities/user.entity”;

export interface UserRepository {
save(user: User): Promisevoid>;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

چارچوب و درایورها

چارچوب ها و درایورها حاوی جزئیات پیاده سازی اینترفیس ها هستند. آنها با سیستم های خارجی مانند پایگاه های داده یا API ها تعامل دارند.

// src/frameworks/in-memory-users.repository.ts
import { User } from “../entities/User”;
import { UserRepository } from “../interfaces/users.repository”;

export class InMemoryUsersRepository implements UserRepository {
private users: User[] = [];

async save(user: User): Promisevoid> {
this.users.push(user);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همه اش را بگذار کنار هم

در نهایت، اجازه دهید یک نقطه ورودی برای اتصال همه چیز ایجاد کنیم.

// src/main.ts
import { CreateUser } from “./usecases/create-user.usecase”;
import { InMemoryUserRepository } from “./frameworks/in-memory-users.repository”;

const userRepository = new InMemoryUserRepository();
const createUser = new CreateUserUseCase(userRepository);

createUser.execute({ email: “john.doe@example.com”, password: “123456” })
.then(() => console.log(“User created successfully”))
.catch(err => console.error(“Failed to create user”, err));

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کامپایل و اجرای پروژه:

tsc
node dist/main.js

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه

با پیروی از اصول Clean Architecture، می‌توانیم سیستمی ایجاد کنیم که قابل نگهداری، آزمایش‌پذیر و سازگار با تغییر باشد. TypeScript تایپ قوی و ویژگی های مدرن جاوا اسکریپت را ارائه می دهد که به اجرای این اصول کمک می کند. با تفکیک واضح مسئولیت‌ها، درک و تکامل کد ما در طول زمان آسان‌تر می‌شود.

Clean Architecture یک فلسفه طراحی نرم افزار است که هدف آن ایجاد سیستم هایی است که نگهداری، آزمایش و درک آن آسان باشد. بر تفکیک مسئولیت‌ها تأکید می‌کند و تضمین می‌کند که هر بخش از سیستم یک مسئولیت واحد دارد. در این مقاله، نحوه پیاده‌سازی معماری پاک با استفاده از TypeScript را بررسی خواهیم کرد.

فهرست مطالب

  1. مقدمه ای بر معماری پاک
  2. اصول بنیادی
  3. پیکربندی پروژه
  4. ساختار پوشه
  5. موجودیت ها
  6. موارد استفاده کنید
  7. رابط ها
  8. چارچوب و درایورها
  9. همه اش را بگذار کنار هم
  10. نتیجه

مقدمه ای بر معماری پاک

معماری پاک که توسط رابرت سی مارتین (عمو باب) معرفی شده است، جدایی واضحی را بین بخش‌های مختلف یک سیستم نرم‌افزاری فراهم می‌کند. ایده اصلی این است که منطق اصلی کسب و کار را مستقل از عوامل خارجی مانند پایگاه های داده، UI یا چارچوب ها نگه دارید.

اصول بنیادی

  1. استقلال: منطق کسب و کار باید مستقل از رابط کاربری، پایگاه داده یا سیستم های خارجی باشد.
  2. آزمایش پذیری: تست سیستم باید آسان باشد.
  3. تفکیک مسئولیت ها: قسمت های مختلف سیستم باید وظایف متفاوتی داشته باشند.
  4. قابلیت نگهداری: نگهداری و تکامل سیستم باید آسان باشد.

پیکربندی پروژه

ابتدا اجازه دهید یک پروژه TypeScript راه اندازی کنیم. شما می توانید استفاده کنید npm یا yarn برای راه اندازی یک پروژه جدید

mkdir clean-architecture-ts
cd clean-architecture-ts
npm init -y
npm install typescript ts-node @types/node --save-dev
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک فایل ایجاد کنید tsconfig.json برای پیکربندی TypeScript

{
  "compilerOptions": {
    "target": "ES6",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساختار پوشه

یک پروژه با معماری تمیز به طور کلی دارای ساختار پوشه زیر است:

src/
├── entities/
├── usecases/
├── interfaces/
├── frameworks/
└── main.ts
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

موجودیت ها

نهادها منطق اصلی تجارت را نشان می دهند. آنها مهمترین بخش سیستم هستند و باید مستقل از عوامل خارجی باشند.

// src/entities/user.entity.ts
export class User {
    constructor(id: string, public email: string, public password:string) {}

    static create(email: string, password: string) {
        const userId = uuid()
        return new User(userId, email, password)
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

موارد استفاده کنید

موارد استفاده حاوی قوانین تجاری خاص برنامه است. آنها تعامل بین موجودیت ها و رابط ها را تنظیم می کنند.

// src/usecases/create-user.usecase.ts
import { User } from "../entities/user.entity";
import { UsersRepository } from "../interfaces/users.repository"

interface CreateUserRequest {
  email: string;
  password: string;
}

export class CreateUserUseCase {
  constructor(private userRepository: UserRepository) {}

  async execute(request: CreateUserRequest): Promisevoid> {
    const user = User.create(request.email, request.password)
    await this.userRepository.save(user);
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

رابط ها

اینترفیس ها قراردادهای بین موارد استفاده و دنیای بیرونی هستند. آنها می توانند شامل مخازن، خدمات یا هر سیستم خارجی باشند.

// src/interfaces/users.repository.ts
import { User } from "../entities/user.entity";

export interface UserRepository {
  save(user: User): Promisevoid>;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

چارچوب و درایورها

چارچوب ها و درایورها حاوی جزئیات پیاده سازی اینترفیس ها هستند. آنها با سیستم های خارجی مانند پایگاه های داده یا API ها تعامل دارند.

// src/frameworks/in-memory-users.repository.ts
import { User } from "../entities/User";
import { UserRepository } from "../interfaces/users.repository";

export class InMemoryUsersRepository implements UserRepository {
  private users: User[] = [];

  async save(user: User): Promisevoid> {
    this.users.push(user);
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همه اش را بگذار کنار هم

در نهایت، اجازه دهید یک نقطه ورودی برای اتصال همه چیز ایجاد کنیم.

// src/main.ts
import { CreateUser } from "./usecases/create-user.usecase";
import { InMemoryUserRepository } from "./frameworks/in-memory-users.repository";

const userRepository = new InMemoryUserRepository();
const createUser = new CreateUserUseCase(userRepository);

createUser.execute({ email: "john.doe@example.com", password: "123456" })
  .then(() => console.log("User created successfully"))
  .catch(err => console.error("Failed to create user", err));
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کامپایل و اجرای پروژه:

tsc
node dist/main.js
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه

با پیروی از اصول Clean Architecture، می‌توانیم سیستمی ایجاد کنیم که قابل نگهداری، آزمایش‌پذیر و سازگار با تغییر باشد. TypeScript تایپ قوی و ویژگی های مدرن جاوا اسکریپت را ارائه می دهد که به اجرای این اصول کمک می کند. با تفکیک واضح مسئولیت‌ها، درک و تکامل کد ما در طول زمان آسان‌تر می‌شود.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا