Sokan Academy

در این پست می خواهم درباره ی ساختارفایل و پوشه بندی مناسب برای پیاده سازی یک پروژه ی وب سرور (منظورم پروژه هایی مثل یک وب سایت، برنامه ای که روی سرور اجرا می شود و ... است) در زبان گولنگ (Golang) یا همان Go بنویسم. 

تعیین ساختارفایل یا پوشه بندی یک پروژه، سه سطح دارد:

  • 🐣 وقتی ما مبتدی هستیم:
    در این شرایط بهتر است فایلها را در پوشه های مختلف قرار ندهید و همه را در یک فایل یا چند فایل ولی در یک پوشه قرار دهید.
  • 🐥 وقتی از سطح مبتدی بالاتر آمدیم:
    موضوع این پست برای افرادی است که در این سطح هستند و حالا وقت آن رسیده است که با پوشه بندی و پکیجی نگاه کردن به کدهای پروژه شان آشنا بشوند. در این مرحله تعداد پوشه ها زیاد نیست ولی در دسته بندی خوبی قرار میگیرند.
  • 🐔 وقتی حرفه ای شده ایم:
    حالا که مرحله های قبلی را به خوبی درک کرده اید، دیگر لازم است به سراغ آموختن روش های سطح بالاتری از دسته بندی کردن کدها در یک محصول بروید. برای مثال می توانید بسته به نیاز پروژه تان، کدها را به صورت MVC ساختار بدهید.

البته منظورم این نیست که افراد حرفه ای با روش های اول و دوم پروژه شان را ساختار بندی نمی کنند. خیر این افراد بسته به نیاز پروژه از هر کدام از آن روش ها بهره می برند. برای مثال اگر شما قرار است یک کتابخانه بنویسید و با افراد دیگر به اشتراک بذارید، روش اول بهترین گزینه برای ساختار بندی برنامه تان است. بنابراین فکر نکنید اگر به خودتان سخت بگیرید و یک دفعه به مرحله ی سوم بروید و دو مرحله ی قبلی را درک نکرده باشید، شما حرفه ای هستید. یک برنامه نویس حرفه ای مزایا و معایب هر کدام را بر اساس کاری که در دست دارد می سنجد و بهترین گزینه را انتخاب می کند.

اگر اولین برنامه ی تان را با Go می نویسید، بهتر است همه ی کدهایتان را در قالب یک فایل بنویسید و در گام های بعدی، برنامه تان را طوری بازنویسی کنید که اصولی تر باشد و فایل ها و پوشه ها، ساختار حرفه ای تری داشته باشند. ولی چه دلایلی باعث می شود ما به سمت پیاده سازی یک ساختار فایل یا پوشه بندی خاص برویم:

  • وقتی شما همه ی کدهایتان را داخل یک پوشه قرار می دهید، وابستگی های زیادی درون برنامه ی شما ایجاد می شود که توسعه، تغییر و یا حذف بخش های برنامه تان، کار بسیار دشواری خواهد شد.
  • اگر بخواهید از یک قابلیتی که در برنامه تان استفاده کرده اید، در برنامه ی دیگری هم بهره ببرید با مشکلات بسیار زیادی روبرو خواهید شد.
  • وقتی فقط یک متد Main دارید، داشتن چند فایل باینری غیر ممکن خواهد بود.

بهترین ساختار پوشه بندی در Go

در این روش سه Folder اصلی زیر را نیاز داریم که کاربرد هر کدام از آنها توضیح داده شده است.

cmd/

این پوشه شامل تمامی فایل های اصلی برنامه شما می باشد که برنامه ی شما از این نقطه اجرا می شود. پوشه ی موجود در این جا باید با نام فایل باینری نهایی که می خواهید داشته باشید مطابقت داشته باشد. برای مثال cmd/simple-service یعنی باینری نهایی که ارائه می دهیم simple-service خواهد بود.

internal/ 

این پکیج (پوشه) شامل کتابخانه ها و کدهای اختصاصی ای می شود که در سرویس تان از آنها استفاده کرده اید. موارد موجود در این Folder فقط در همین برنامه استفاده می شود و قرار نیست توسط برنامه ی دیگری مشاهده یا مورد استفاده قرار بگیرند.

pkg/

در این پوشه کدهایی قرار دارد که بقیه ی برنامه ها می توانند آنها را مشاهده کرده و یا از آنها استفاده کنند.برای مثال کدهای مرتبط با API کلاینت یا توابعی که می توانند در پروژه های دیگر هم مورد استفاده قرار بگیرند و برای همین پروژه شخصی سازی نشده است در این Folder قرار می گیرند.

پیشنهاد می کنم به گونه ای کد بنویسید که تعداد توابع موجود در پوشه ی internal تان خیلی کمتر از pkg باشد. حتی حالت مطلوب این است که پوشه ی internal را حذف کنید 😎 اگر با این رویکرد کد نویسی انجام دهید، کدهای مستقل تر و بهتری خواهید نوشت و کار خودتان را برای پروژه های بعدی راحت تر می کنید.

مثالی از ساختار پوشه بندی در GO

در زیر می توانید یک پروژه ی ساده را ببنیدی که به چه شکلی پوشه بندی شده است. پوشه های اصلی که در بالا توضیح داده شده است و مابقی پوشه ها به گونه ای نام گذاری شده است که قابل تشخیص باشد.

  • my-web-app
    • cmd
      • backend
        • main.go
      • client
        • main.go
    • pkg
      • api
        • crud.go
      • auth
        • user.go
        • access-controll.go
      • conf
        • conf.go
      • db
        • db.go
        • transaction.go
        • acid.go
        • migrate.go
      • metrics
        • metrics.go

 

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

این محتوا آموزنده بود؟
کد نویسیMVCساخت سایت

sokan-academy-footer-logo
کلیه حقوق مادی و معنوی این وب‌سایت متعلق به سکان آکادمی می باشد.