
در این آموزش، یک برنامه مدیریت مخاطبین یا همان دفترچه تلفن خواهیم ساخت که نام، ایمیل و شماره تلفنها را در پایگاه داده ذخیره میکند. در این مسیر، یاد میگیرید که چگونه یک پروژه پایتونی را به شکلی حرفهای و تمیز ساختاردهی کنید تا تغییر دادن، تست کردن و درک کدهای آن آسان باشد. در درس نخست، دایرکتوری پروژه را میسازیم، ابزارهای مورد نیاز را نصب میکنیم و درباره معماری لایهای (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 ایجاد کرده و محتوای زیر را در آن کپی کنید:
[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 اجرا میکند. (این ماژول بعداً ایجاد خواهد شد).
حالا میتوانیم پروژه اولیه خود را نصب کنیم تا پایتون آن را بشناسد. در دستور pip install گزینه قابل ویرایش -e کد را مستقیماً لینک میکند؛ یعنی تغییراتی که بعداً در کد میدهید، بلافاصله و بدون نیاز به نصب مجدد اعمال میشوند. در ترمینال (در ریشه پروژه) اجرا کنید:
pip install -e .
بعد از چند ثانیه، وابستگیها (Typer و Rich) دانلود و نصب میشوند. میتوانید نصب را با تایپ دستور contact امتحان کنید. این دستور هنوز کار نخواهد کرد و خطا تولید خواهد کرد زیرا ما هنوز کدهای داخلی را ننوشتهایم. در حقیقت سیستم سعی دارد دستور را اجرا کند اما ماژول CLI هنوز وجود ندارد.
ما حالا یک بستر تمیز و آماده برای توسعه داریم. در درس بعدی، لایه دامنه (Domain) را خواهیم نوشت؛ یک کلاس ساده پایتونی برای نمایش یک مخاطب یا همان دفترچه تلفن. در آنجا با dataclasses و type hints آشنا خواهیم شد؛ دو ویژگی پایتون که کد را واضحتر و ایمنتر میکنند.