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 را بررسی خواهیم کرد.
فهرست مطالب
- مقدمه ای بر معماری پاک
- اصول بنیادی
- پیکربندی پروژه
- ساختار پوشه
- موجودیت ها
- موارد استفاده کنید
- رابط ها
- چارچوب و درایورها
- همه اش را بگذار کنار هم
- نتیجه
مقدمه ای بر معماری پاک
معماری پاک که توسط رابرت سی مارتین (عمو باب) معرفی شده است، جدایی واضحی را بین بخشهای مختلف یک سیستم نرمافزاری فراهم میکند. ایده اصلی این است که منطق اصلی کسب و کار را مستقل از عوامل خارجی مانند پایگاه های داده، 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 تایپ قوی و ویژگی های مدرن جاوا اسکریپت را ارائه می دهد که به اجرای این اصول کمک می کند. با تفکیک واضح مسئولیتها، درک و تکامل کد ما در طول زمان آسانتر میشود.