ویرگول
ورودثبت نام
سلام فرمانده
سلام فرماندهاز دنیای فناوری تا گوشه های ذهنم
سلام فرمانده
سلام فرمانده
خواندن ۴ دقیقه·۱۵ روز پیش

مینی پروژه دفترچه تلفن در پایتون، یک پروژه CLI لایه‌ای و حرفه‌ای، درس ۱

یک تصویر از اجرای مینی پروژه دفترچه تلفن
یک تصویر از اجرای مینی پروژه دفترچه تلفن

درس ۱: آماده‌سازی پروژه و آشنایی با معماری پاک (Clean Architecture)

در این آموزش، یک برنامه مدیریت مخاطبین یا همان دفترچه تلفن خواهیم ساخت که نام، ایمیل و شماره تلفن‌ها را در پایگاه داده ذخیره می‌کند. در این مسیر، یاد می‌گیرید که چگونه یک پروژه پایتونی را به شکلی حرفه‌ای و تمیز ساختاردهی کنید تا تغییر دادن، تست کردن و درک کدهای آن آسان باشد. در درس نخست، دایرکتوری پروژه را می‌سازیم، ابزارهای مورد نیاز را نصب می‌کنیم و درباره معماری لایه‌ای (Layered Architecture) صحبت خواهیم کرد.

چه چیزی می‌سازیم؟

یک برنامه مدیریت مخاطبین که قابلیت‌های زیر را دارد:

  • افزودن مخاطب جدید

  • نمایش لیست تمام مخاطبین ذخیره شده در یک جدول زیبا

  • حذف یک مخاطب با استفاده از شناسه (ID) آن

بعد از اتمام پروژه، برای انجام این کارها کافی است دستورات contact add، contact list و contact delete 1 را در ترمینال تایپ کنید.

چرا «کد تمیز» و لایه‌های مختلف؟

اگر تمام کدها را در یک فایل بزرگ بنویسید، در ابتدا کار می‌کند؛ اما با بزرگتر شدن برنامه، کدها پیچیده می‌شوند و یک تغییر کوچک در آن می‌تواند باعث خرابی بخش‌های زیادی شود. کد تمیز (Clean Code) یعنی سازماندهی برنامه به گونه‌ای که هر بخش، وظیفه‌ای مشخص و مستقل داشته باشد. پروژه ما به سه لایه اصلی (به اضافه یک لایه نمایش) تقسیم می‌شود:

  • دامنه (Domain) – "چه چیزی": میتواند شامل تعدادی کلاس ساده باشد که صرفا ساختار موجودیت ها و داده ها را شرح دهد بدون اینکه کوچکترین اشاره ای به ذخیره‌سازی یا نمایش آنها بکند. (در این پروژه منظور کلاس contact است که داده‌های مخاطب یا همان دفترچه تلفن را نگه می‌دارد)

  • مخزن (Repository) – "چگونه ذخیره شود": کدی که با پایگاه داده (SQLite) صحبت می‌کند. ما ابتدا یک قرارداد انتزاعی (Interface) می‌نویسیم تا بقیه برنامه اهمیتی ندهد که داده‌ها کجا (پایگاه داده SQLite، فایل JSON، فایل CSV و غیره) ذخیره می‌شوند.

  • سرویس (Service) – "چه کاری انجام شود": قوانین کسب و کاری مانند «فرآیند افزودن، حذف، بروزرسانی و نمایش مخاطب». این لایه از مخزن استفاده می‌کند بدون اینکه از جزئیات فنی نحوه انجام این اعمال باخبر باشد.

  • رابط خط فرمان (CLI) – "چگونه تعامل کنیم": این لایه بیرونی است که ورودی کاربر را می‌خواند و فرآیندهای کسب و کاری لایه سرویس را صدا می‌زند بدون آنکه از جزئیات آنها باخبر باشد. ما از کتابخانه Typer برای ساخت دستورات و از Rich برای زیبا‌سازی خروجی استفاده می‌کنیم.

این جداسازی، معماری لایه‌ای نامیده می‌شود. این کار باعث می‌شود کد شما راحت‌تر نگهداری، تست و گسترش یابد. بعداً می‌توانید بدون تغییر دادن قوانین کسب و کاری، SQLite را با یک پایگاه داده دیگر عوض کنید.

ابزارهای مورد نیاز

  • پایتون نسخه ۳.۱۰ یا جدیدتر.

  • یک ویرایشگر متن یا IDE (مانند VS Code، PyCharm یا Notepad).

نسخه پایتون خود را با این دستور چک کنید:

python --version

ساخت پوشه پروژه

کار را با ساخت یک پوشه برای پروژه شروع می‌کنیم. نام پوشه را contact_manager می‌گذاریم. داخل آن، یک پوشه دیگر با همان نام برای پکیج اصلی برنامه و یک فایل مخصوص به نام pyproject.toml می‌سازیم. باید ساختار پوشه به این شکل باشد (پوشه بیرونی contact_manager ریشه پروژه است):

contact_manager/             ← ریشه پروژه ├── contact_manager/         ← پکیج پایتون (کدهای اصلی) │   └── init.py └── (رااضافه می‌کنیم pyproject.toml در مرحله بعد فایل)

تنظیمات pyproject.toml

پروژه‌های مدرن پایتون از فایل pyproject.toml برای اعلام نام، نسخه، وابستگی‌ها و حتی دستوراتی که قرار است اجرا شوند، استفاده می‌کنند. این فایل را در ریشه پروژه (پوشه بیرونی) بسازید. یک فایل جدید به نام pyproject.toml ایجاد کرده و محتوای زیر را در آن کپی کنید:

[build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" [project] name = "contact-manager" version = "0.1.0" description = "A minimal contact manager program" requires-python = ">=3.10" dependencies = [     "typer",     "rich", ] [project.scripts] contact = "contact_manager.cli:app"

توضیح خط به خط کد:

  • بخش [build-system] به ابزارهایی مثل pip می‌گوید که چگونه پکیج را نصب کنند.

    • دستور requires = ["setuptools"] می‌گوید: «برای اینکه یک پروژه از کد منبع به یک پکیج قابل نصب تبدیل شود، به ابزار setuptools نیاز است که باید نصب شود.»

    • خط ۳ می‌گوید: «بعد از نصب ابزارهای لازم، برای شروع فرایند ساخت (Build) از این ماژول باید استفاده شود. این بخش کار اصلی فرایند ساخت را انجام می‌دهد.»

  • بخش [project] حاوی اطلاعات متادیتای زیر است:

    • نام، نسخه و شرح پکیج و حداقل نسخه پایتون مورد نیاز.

    • دستور dependencies فهرست کتابخانه‌هایی لازم را مشخص می‌کند: Typer (برای ساخت دستورات CLI) و Rich (برای خروجی‌های رنگی و زیبا).

  • خط [project.scripts] یک دستور به نام contact تعریف می‌کند که پس از نصب، تابع app را در ماژول contact_manager.cli اجرا می‌کند. (این ماژول بعداً ایجاد خواهد شد).

نصب پروژه در حالت قابل ویرایش (Editable Mode)

حالا می‌توانیم پروژه اولیه خود را نصب کنیم تا پایتون آن را بشناسد. در دستور pip install گزینه قابل ویرایش -e کد را مستقیماً لینک می‌کند؛ یعنی تغییراتی که بعداً در کد می‌دهید، بلافاصله و بدون نیاز به نصب مجدد اعمال می‌شوند. در ترمینال (در ریشه پروژه) اجرا کنید:

pip install -e .

بعد از چند ثانیه، وابستگی‌ها (Typer و Rich) دانلود و نصب می‌شوند. می‌توانید نصب را با تایپ دستور contact امتحان کنید. این دستور هنوز کار نخواهد کرد و خطا تولید خواهد کرد زیرا ما هنوز کدهای داخلی را ننوشته‌ایم. در حقیقت سیستم سعی دارد دستور را اجرا کند اما ماژول CLI هنوز وجود ندارد.

قدم بعدی چیست؟

ما حالا یک بستر تمیز و آماده برای توسعه داریم. در درس بعدی، لایه دامنه (Domain) را خواهیم نوشت؛ یک کلاس ساده پایتونی برای نمایش یک مخاطب یا همان دفترچه تلفن. در آنجا با dataclasses و type hints آشنا خواهیم شد؛ دو ویژگی پایتون که کد را واضح‌تر و ایمن‌تر می‌کنند.

کد تمیزپایتون
۰
۰
سلام فرمانده
سلام فرمانده
از دنیای فناوری تا گوشه های ذهنم
شاید از این پست‌ها خوشتان بیاید