سه نکته خیلی مهم 🙂
۱. شروطتون رو اسم گذاری کنید. مثلا دیدم ۳ خط شرط نوشتن, که خب مشخص نیست چیو داره دقیقا چک میکنه!
از توی ریپو اگه ببینید مثال زدم
is_classroom_teacher = relation.teacher_id == asked_id
if is_classroom_teacher:
...
is_self_student = relation.student_id == asked_id and asked_id == ask_for_id
if is_self_student:
...
خیلی مشخصه چیو چک داره میکنه دقیقا 🙂
۲. استفاده از NewType
درسته که مثلا user_id من UUID هست ولی دلیل نمیشه من همه جای کد بنویسم این UUID عه! چون user id من با student id من فرق میکنه. پس بهتره براش تایپ جدیدی بنویسم و توی خود مدل هم به جای اینکه بگم این UUID هست بگم این UserId هست. اینطوری اگه به تابعی چیزی پاس بدم که مثلا student_id میخواست ولی منuser_id دادم اون موقع کد ادیتور من بهم ارور میده.
تایپ هام تو ریپو
۳. استفاده از TypeVar
فرق بین typevar و newtype اینه که TypeVar دقیقا تایپ جدید نیست. بلکه تایپیه که داره یک چیزی رو represent میکنه
خیلیی به درد میخوره. شما با تایپینگ میتونید کدتون رو داکیومنت کنید!یعنی چی؟الان توضیح میدم👀
فکر کنید من تابعی دارم که میخوام یک نویسنده رو اضافه کنم به عنوان اصلاح کننده (یا ادیتور)
assign_editor_to_author(editor: Author, blog_author: Author) -> Author
الان اینجا مشخص نیست که من خود نویسنده رو برگردوندم یا ادیتور رو؟ باید کل تابع رو بشینم بخونم. تایپ جدیدی هم ندارم که NewType بسازم. جفتشون واقعا Author هستند حالا یکیشون اومده اینجا ادیتور شده. پس چیکار میکنم؟از TypeVar استفاده میکنم و bound میکنم
Editor = TypeVar("Editor", bound=Author)
BlogAuthor = TypeVar("BlogAuthor", bound=Author)
assign_editor_to_author(editor: Editor, blog_author: BlogAuthor) -> BlogAuthor
اینجا کاملا مشخصه که چی گرفتم و کی برگشته! کسی بدون اینکه کدمو بخونه میتونه بفهمه.