برنامههای Go میتوانند انواع مختلفی از فایلهای کد منبع را ترکیب کنند، بنابراین استفاده از یک ساختار مستحکم و معمولی مزایای زیادی دارد.
معماری شش ضلعی (یا «پورتها و آداپتورها») یک الگوی معماری نرمافزاری محبوب است که میتوانید هنگام ساخت برنامههای Go خود از آن استفاده کنید. با استفاده از آن، می توانید مقیاس پذیری، قابلیت نگهداری و آزمایش پذیری برنامه خود را بهبود بخشید.
این معماری به جدا کردن منطق کسب و کار از وابستگی ها و زیرساخت های خارجی کمک می کند و برنامه شما را انعطاف پذیر و نگهداری آسان تر می کند.
معماری شش ضلعی چیست؟
معماری شش ضلعی برنامه ها را به سه لایه اصلی تقسیم می کند:
- لایه Application منطق اصلی برنامه را مستقل از وابستگی های شخص ثالث در خود جای می دهد. لایه برنامه باید شامل منطق کسب و کار، مدل های دامنه و خدمات برنامه باشد.
- لایه پورت ها و آداپتورها آداپتورها را در خود جای می دهد که با برنامه های موجود در تعامل هستند. پورت ها رابط هایی هستند که عملیات را برای برنامه شما تعریف می کنند، در حالی که آداپتورها پیاده سازی رابط ها هستند. آداپتورها می توانند پایگاه داده، API های HTTP، کارگزاران پیام یا هر سیستم خارجی دیگری باشند.
- لایه زیرساخت محل اجرای آداپتورها است. لایه زیرساخت باید شامل پایگاه های داده، کارگزاران پیام و سایر سیستم های خارجی باشد.
مزایای استفاده از معماری شش ضلعی
معماری شش ضلعی به دلیل مزایای زیر که ارائه می دهد محبوب است.
مقیاس پذیری و نگهداری پروژه
تقسیم بندی برنامه های شما امکان ایجاد یک پایگاه کد ماژولار و جدا شده را فراهم می کند که مقیاس و نگهداری برنامه شما را آسان تر می کند.
شما می توانید آداپتورها را بدون تأثیر بر منطق هسته حذف کنید و منطق هسته را بدون تأثیر بر آداپتورها تغییر دهید. این بدان معناست که می توانید به راحتی آداپتورها را بدون بازنویسی کل برنامه خود جایگزین کنید.
تست پذیری و سهولت ادغام
معماری شش ضلعی تست پذیری را افزایش می دهد زیرا می توانید تست های واحد را برای منطق هسته بدون وابستگی های خارجی ساختگی بنویسید. میتوانید بدون نیاز به راهاندازی پایگاه داده یا کارگزار پیام، از دوبلهای آزمایشی، مانند جعلی یا خرد، استفاده کنید.
معماری شش ضلعی همچنین ادغام برنامه شما با سایر سیستم ها را آسان می کند. از آنجایی که آداپتورها از منطق اصلی جدا هستند، می توانید از آنها در برنامه های کاربردی دیگر یا برای میکروسرویس ها استفاده مجدد کنید. همچنین می توانید API های پورت برنامه خود را برای مصرف در سیستم های دیگر در معرض دید قرار دهید.
انعطاف پذیری و سازگاری با نیازهای در حال تغییر
معماری شش ضلعی انعطاف پذیری و سازگاری با نیازهای متغیر را فراهم می کند. از آنجایی که منطق اصلی مستقل از آداپتورها است، میتوانید به راحتی عملکرد برنامه را بدون تأثیر بر آداپتورها تغییر دهید یا گسترش دهید.
شما می توانید برنامه خود را در طول زمان تکامل دهید و به سیستم های خارجی خاص پایبند باشید.
برو و معماری شش ضلعی
در اصل، معماری شش ضلعی مربوط به جداسازی منطق تجاری اصلی برنامه از زیرساخت است تا بتوانید وابستگی ها را بدون تأثیر بر منطق اصلی برنامه تعویض کنید و نگهداری و آزمایش برنامه را آسان تر می کند.
برنامه معمولی شش ضلعی Go از چهار دایرکتوری اصلی استفاده می کند: cmd، داخلی، pkg و vendor.
دایرکتوری cmd شامل برنامه های اصلی پروژه است. کدی که در اینجا می نویسید معمولاً توابع را از فایل های موجود در pkg و دایرکتوری های داخلی فراخوانی می کند.
دایرکتوری داخلی باید حاوی یک کد برنامه خصوصی باشد که نمی خواهید کاربران آن را به برنامه خود وارد کنند. کامپایلر Go الگوی چیدمان داخلی را اعمال می کند و شما می توانید به تعداد دلخواه دایرکتوری های داخلی در فهرست های دیگر داشته باشید. شما محدود به یک فهرست داخلی سطح بالا نیستید.
دایرکتوری pkg باید حاوی کد کتابخانه ای باشد که می خواهید برنامه های خارجی وارد و استفاده کنند. اگرچه استفاده از دایرکتوری pkg یک روش معمول است، اما در سراسر جهان پذیرفته یا اجرا نمی شود.
دایرکتوری فروشنده باید دارای وابستگی های برنامه باشد (مدیریت دستی یا خودکار). میتوانید از دستور go mod vendor برای ایجاد دایرکتوری vendor / برای استفاده از قابلیتهایی که Go برای فروشندگان ارائه میکند استفاده کنید.
پیاده سازی معماری شش ضلعی در Go
ساختار فایل پروژه شما هنگام اجرای معماری شش ضلعی در هر زبانی از جمله Go مهم است.
در اینجا یک نمونه ساختار فایل برای پیاده سازی معماری شش ضلعی در Go آمده است:
.
├── cmd
│ └── http
│ └── main.go
├── internal
│ ├── adapters
│ │ ├── api
│ │ │ └── api_adapter.go
│ │ └── database
│ │ └── db_adapter.go
│ ├── app
│ │ ├── domain
│ │ │ ├── entity1.go
│ │ │ └── entity2.go
│ │ ├── ports
│ │ │ ├── input
│ │ │ │ ├── input_port1.go
│ │ │ │ └── input_port2.go
│ │ │ └── output
│ │ │ ├── output_port1.go
│ │ │ └── output_port2.go
│ │ └── usecases
│ │ ├── usecase1.go
│ │ └── usecase2.go
├── pkg
│ ├── input
│ │ ├── input1.go
│ │ └── input2.go
│ └── output
│ ├── output1.go
│ └── output2.go
└── vendor
├── module1
│ ├── file1.go
│ └── file2.go
└── module2
├── file1.go
└── file2.go
دایرکتوری pkg حاوی پورت های ورودی و خروجی برنامه شما در این مثال است. در این فایل ها رابط هایی را برای پورت های ورودی و خروجی تعریف خواهید کرد.
دایرکتوری داخلی شامل دامنه برنامه و موارد استفاده است. منطق تجاری برنامه خود را در این فایل ها می نویسید.
دایرکتوری adapters حاوی کد زیرساختی است که برنامه شما را به پایگاه داده و API متصل می کند.
راه اندازی ساختار فایل معماری شش ضلعی
تنظیم ساختار فایل معماری شش ضلعی پروژه شما می تواند دشوار باشد، اما می توانید یک اسکریپت bash بنویسید تا فرآیند ایجاد دایرکتوری را خودکار کنید.
این دستور را در دایرکتوری کاری پروژه خود اجرا کنید تا یک اسکریپت bash، hexagonal.sh ایجاد کنید و به آن مجوزهای خواندن، نوشتن و اجرا بدهید:
touch hexagonal.sh && chmod 777 hexagonal.sh
این کد bash را در hexagonal.sh وارد کنید تا ساختار فایل در فهرست کاری فعلی شما ایجاد شود:
#!/bin/bash
# create top level directories
mkdir cmd internal pkg vendor
# create cmd/http directory
mkdir cmd/http
# create internal directories
mkdir internal/adapters internal/app internal/app/domain internal/app/ports internal/app/ports/input internal/app/ports/output internal/app/usecases
# create internal/adapters directories
mkdir internal/adapters/api internal/adapters/database
# create internal/app/ports directories
mkdir internal/app/ports/input internal/app/ports/output
# create vendor directories
mkdir vendor/module1 vendor/module2
# print success message
echo "Directory structure created successfully."
شما می توانید این اسکریپت bash را با دستور زیر اجرا کنید:
./hexagonal.sh
برنامه bash پوشهها و زیرپوشهها را ایجاد میکند تا بتوانید فایلها را ایجاد کنید و منطق تجاری را برای برنامه خود بنویسید.
معماری شش ضلعی برای کاربردهای پیچیده ساختمانی مفید است
پیاده سازی معماری شش ضلعی می تواند زمان بر باشد، اما مزایای آن در دراز مدت بیشتر از هزینه است. با جدا کردن نگرانیها و ماژولار کردن کد خود، میتوانید به راحتی برنامههای خود را نگهداری و آزمایش کنید.
بسیاری از الگوهای معماری دیگر وجود دارد که هر کدام دارای مزایا و معایب برای ساخت برنامه های کاربردی انعطاف پذیر و کاربردی هستند. اینها شامل معماری محبوب MVC (مدل، نمایش، کنترلر) برای ایجاد برنامه های کاربردی وب است.