Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (MohammadMahdi)
Please open Telegram to view this post
VIEW IN TELEGRAM
📗 #معرفی_کتاب
Machine Learning A Probabilistic Perspective
🔺کتابی خوب برای یادگیری دقیق Machine learning
اگر میخواید یادگیری ماشین رو درست و حسابی یادبگیرید بهتره هرچه زودتر برای خوندن این کتاب برنامهریزی کنید!
🔎 @py4ds
Machine Learning A Probabilistic Perspective
🔺کتابی خوب برای یادگیری دقیق Machine learning
اگر میخواید یادگیری ماشین رو درست و حسابی یادبگیرید بهتره هرچه زودتر برای خوندن این کتاب برنامهریزی کنید!
🔎 @py4ds
🔺 امروز میخوام درباره یکی از ویژگیهای پایتون ۳.۸ به نام Literal Type صحبت کنم.
◀️ این ویژگی بر اساس pep586 پیادهسازی شده که به ما امکان میده نوع دادههای حرفی (literal) رو تعریف کنیم. این نوع دادهها نشون میدن که یک متغیر یا یک عبارت یک مقدار مشخص و ثابت داره. برای مثال، اگر میخواهیم یک تابع بنویسیم که فقط مقادیر "put" یا "patch" رو قبول کنه، میتونیم از
به عنوان نوع ورودی استفاده کنیم. این کار به ما کمک میکنه که کد رو بهتر مستندسازی کنیم و از خطاهای احتمالی جلوگیری کنیم. برای اطلاعات بیشتر میتونید به [مستندات رسمی پایتون](https://peps.python.org/pep-0586/) مراجعه کنید.
برای استفاده از Literal Type باید از ماژول typing وارد کنیم:
همانطور که میبینید، اگر مقداری غیر از "put" یا "patch" به تابع بدهیم، خطای نوع داده دریافت میکنیم. این روش به ما امکان میده که کد رو برای خواننده و تحلیلگر قابل فهمتر کنیم.
میشه Literal Typeها را با سایر نوعهای داده ترکیب کنیم. برای مثال، اگر میخواهیم تابعی بنویسیم که یک رشته را بگیرد و آن را چاپ کند، میتوانیم از Union استفاده کنیم:
به این ترتیب، میتوانیم محدودیتهایی روی نوع ورودیهای تابع بگذاریم و کد رو قویتر کنیم.
🔹امیدوارم این پست براتون مفید بوده باشه. ممنون از توجهتون. منتظر نظرات و پیشنهادات شما هستم.
🔎 @py4ds
◀️ این ویژگی بر اساس pep586 پیادهسازی شده که به ما امکان میده نوع دادههای حرفی (literal) رو تعریف کنیم. این نوع دادهها نشون میدن که یک متغیر یا یک عبارت یک مقدار مشخص و ثابت داره. برای مثال، اگر میخواهیم یک تابع بنویسیم که فقط مقادیر "put" یا "patch" رو قبول کنه، میتونیم از
Literal["put", "patch"]
به عنوان نوع ورودی استفاده کنیم. این کار به ما کمک میکنه که کد رو بهتر مستندسازی کنیم و از خطاهای احتمالی جلوگیری کنیم. برای اطلاعات بیشتر میتونید به [مستندات رسمی پایتون](https://peps.python.org/pep-0586/) مراجعه کنید.
برای استفاده از Literal Type باید از ماژول typing وارد کنیم:
from typing import Literal
def send_request(method: Literal["put", "patch"]) -> None:
if method == "put":
# do something with put
elif method == "patch":
# do something with patch
else:
raise ValueError("Invalid method")
send_request("put") # OK
send_request("patch") # OK
send_request("post") # ValueError: Invalid method
همانطور که میبینید، اگر مقداری غیر از "put" یا "patch" به تابع بدهیم، خطای نوع داده دریافت میکنیم. این روش به ما امکان میده که کد رو برای خواننده و تحلیلگر قابل فهمتر کنیم.
میشه Literal Typeها را با سایر نوعهای داده ترکیب کنیم. برای مثال، اگر میخواهیم تابعی بنویسیم که یک رشته را بگیرد و آن را چاپ کند، میتوانیم از Union استفاده کنیم:
from typing import Literal, Union
def print_string(s: Union[Literal["Hello", "World"], str]) -> None:
print(s)
print_string("Hello") # Hello
print_string("World") # World
print_string("Python") # Python
print_string(42) # TypeError: Argument 's' to 'print_string' has incompatible type 'int'; expected 'Union[Literal['Hello', 'World'], str]'
به این ترتیب، میتوانیم محدودیتهایی روی نوع ورودیهای تابع بگذاریم و کد رو قویتر کنیم.
🔹امیدوارم این پست براتون مفید بوده باشه. ممنون از توجهتون. منتظر نظرات و پیشنهادات شما هستم.
🔎 @py4ds
Python Enhancement Proposals (PEPs)
PEP 586 – Literal Types | peps.python.org
This PEP proposes adding Literal types to the PEP 484 ecosystem. Literal types indicate that some expression has literally a specific value. For example, the following function will accept only expressions that have literally the value “4”:
Forwarded from Python BackendHub (Mani)
“… Because the problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle. “ —Joe Armstrong, creator of Erlang progamming language
وقتی به یک موز نیاز دارین تو یک تابعی , یک گوریلا با موز ندین به اون تابع! 😁 مقاله مدیوم:
https://medium.com/codemonday/banana-gorilla-jungle-oop-5052b2e4d588
یک مثال خیلی قشنگ. اشتباهی که خیلیا انجام میدن
مثلا شما به آیدی یوزر نیاز داری تو یک فانکشن. به جای اینکه یوزر رو بذاری تو signature و ایدی رو ازش بگیری سعی کن یوزر آیدی رو فقط بگیری. اینو به دلیل پرفومنس نمیگم چون تاثیری نداره ولی به این دلیل میگم که کدتون رو به شدت reusable تر میکنه. حالا میتونه اون فانکشن رو صدا بزنی بدون اینکه اطلاعات دیگه ای از یوزر داشته باشی یا بدون اینکه هیت بزنی به دیتابیس پس حتی میشه گفت پرفومنس رو بهتر هم میکنه.
به این قانون law of demeter هم میگن. هدفشم چیزی جز بهتر شدن reusability کدتون و راحت تر تست نوشتن نیست.
@ManiFoldsPython
وقتی به یک موز نیاز دارین تو یک تابعی , یک گوریلا با موز ندین به اون تابع! 😁 مقاله مدیوم:
https://medium.com/codemonday/banana-gorilla-jungle-oop-5052b2e4d588
یک مثال خیلی قشنگ. اشتباهی که خیلیا انجام میدن
مثلا شما به آیدی یوزر نیاز داری تو یک فانکشن. به جای اینکه یوزر رو بذاری تو signature و ایدی رو ازش بگیری سعی کن یوزر آیدی رو فقط بگیری. اینو به دلیل پرفومنس نمیگم چون تاثیری نداره ولی به این دلیل میگم که کدتون رو به شدت reusable تر میکنه. حالا میتونه اون فانکشن رو صدا بزنی بدون اینکه اطلاعات دیگه ای از یوزر داشته باشی یا بدون اینکه هیت بزنی به دیتابیس پس حتی میشه گفت پرفومنس رو بهتر هم میکنه.
# BAD
def activate_user(user: User, session) -> None
session.execute(sa.update(User).where(User.id==user.id).values(is_active=True)
# GOOD
def activate_user(user_id: UserId, session) -> None
session.execute(sa.update(User).where(User.id==user_id).values(is_active=True)
به این قانون law of demeter هم میگن. هدفشم چیزی جز بهتر شدن reusability کدتون و راحت تر تست نوشتن نیست.
@ManiFoldsPython
Medium
Banana Gorilla Jungle — OOP
From the famous quote,
🐍 anaconda در مقابل virtualenv: کدام یک را برای پایتون استفاده کنیم؟ 🐍
اگر شما یک کاربر پایتون هستید، ممکن است از anaconda و virtualenv، دو ابزار محبوب که میتوانند به شما در ایجاد و مدیریت محیطها و بستههای پایتون کمک کنند، شنیده باشید. اما چه تفاوت و مزیت و معایبی بین آنها وجود دارد؟ و کدام یک را باید برای پروژههای خود استفاده کنید؟
در این پست، ما anaconda و virtualenv را از نظر ویژگیها، مزایا و معایبشان مقایسه میکنیم و به شما چند راهنمای عمومی میدهیم که چگونه بهترین ابزار را برای نیازهای خود انتخاب کنید.
📕ابزار anaconda چیست؟
ابزار anaconda یک توزیع از پایتون و R است که با بسیاری از بستههای از پیش نصب شده برای علوم داده، یادگیری ماشین و محاسبات علمی همراه است. همچنین شامل کاندا، یک مدیر بسته و محیط است که میتواند بستهها را از منابع مختلف نصب کند و محیطهای جدا شده ایجاد کند. anaconda همچنین دارای یک رابط کاربری گرافیکی به نام ناوگان است که میتواند به مبتدیان و غیر برنامهنویسان در راهاندازی برنامهها، مدیریت بستهها و محیطها و دسترسی به مستندات کمک کند.
📗ابزار virtualenv چیست؟
ابزار virtualenv یک ابزار است که به شما اجازه میدهد محیطهای پایتون جدا شده ایجاد کنید. از pip به عنوان مدیر بسته خود استفاده میکند که بستهها را از فهرست بسته پایتون (PyPI) نصب میکند. virtualenv یک ابزار خط فرمان است که نیاز به آشنایی با دستورات ترمینال دارد.
📘مزایا و معایب anaconda در مقابل virtualenv
این برخی از مزایا و معایب استفاده از anaconda در مقابل virtualenv هستند:
🔺ابزار anaconda فضای بیشتری از دیسک را در مقایسه با virtualenv اشغال میکند، زیرا با بسیاری از بستههایی که ممکن است نیاز یا استفاده نداشته باشید، همراه است. virtualenv به شما اجازه میدهد تنها بستههایی را که برای پروژه خود نیاز دارید نصب کنید، که میتواند فضا را صرفهجویی کند و تضادها را جلوگیری کند.
🔺ابزار anaconda میتواند محیطها و بستههای R را هم مدیریت کند، که میتواند مفید باشد اگر با هر دو زبان کار کنید. virtualenv تنها برای پایتون است و شما برای مدیریت محیطها و بستههای R به ابزار دیگری مانند رنو نیاز دارید.
🔺ابزار anaconda دارای یک رابط کاربری گرافیکی به نام ناوگان است که میتواند به مبتدیان و غیر برنامهنویسان در راهاندازی برنامهها، مدیریت بستهها و محیطها و دسترسی به مستندات کمک کند. virtualenv یک ابزار خط فرمان است که نیاز به آشنایی با دستورات ترمینال دارد.
🔺ابزار anaconda مناسبتر برای پروژههای علوم داده و نیاز به مجموعه گستردهای از بستههای از پیش نصب شده است. virtualenv انعطافپذیرتر است و به شما کنترل بیشتری بر روی نسخهها و بستههای پایتون میدهد.
📙چگونه بهترین ابزار را برای نیازهای خود انتخاب کنیم؟
تجربه کاربران ممکن است بسته به ترجیحات، نیازها و موارد استفادهشان متفاوت باشد. برخی از راهنماییهای عمومی عبارتند از:
🔺برای محیطهای حداقلی: اگر شما ترجیح میدهید محیطهای سبک و حداقلی داشته باشید، virtualenv انتخاب بهتری است .
🔺برای پروژههای علوم داده: اگر شما روی پروژههای علوم داده کار میکنید و نیاز به مجموعه گستردهای از بستههای از پیش نصب شده دارید، anaconda مناسبتر است .
🔺برای مبتدیان: اگر شما تازه به پایتون علاقهمند شدهاید و ترجیح میدهید یک رابط کاربری گرافیکی داشته باشید، ناوگان anaconda میتواند به شما کمک کند .
🔺برای کاربران پیشرفته: اگر شما با خط فرمان راحت هستید و میخواهید کنترل بیشتری بر روی نسخهها و بستههای پایتون داشته باشید، virtualenv انعطافپذیرتر است .
📝امیدوارl این پست به شما کمک کند تا مزایا و معایب استفاده از anaconda در مقابل virtualenv را بفهمید. اگر سوال یا نظری داشتید، لطفا بنویسید. 🙌
🔎 @py4ds
اگر شما یک کاربر پایتون هستید، ممکن است از anaconda و virtualenv، دو ابزار محبوب که میتوانند به شما در ایجاد و مدیریت محیطها و بستههای پایتون کمک کنند، شنیده باشید. اما چه تفاوت و مزیت و معایبی بین آنها وجود دارد؟ و کدام یک را باید برای پروژههای خود استفاده کنید؟
در این پست، ما anaconda و virtualenv را از نظر ویژگیها، مزایا و معایبشان مقایسه میکنیم و به شما چند راهنمای عمومی میدهیم که چگونه بهترین ابزار را برای نیازهای خود انتخاب کنید.
📕ابزار anaconda چیست؟
ابزار anaconda یک توزیع از پایتون و R است که با بسیاری از بستههای از پیش نصب شده برای علوم داده، یادگیری ماشین و محاسبات علمی همراه است. همچنین شامل کاندا، یک مدیر بسته و محیط است که میتواند بستهها را از منابع مختلف نصب کند و محیطهای جدا شده ایجاد کند. anaconda همچنین دارای یک رابط کاربری گرافیکی به نام ناوگان است که میتواند به مبتدیان و غیر برنامهنویسان در راهاندازی برنامهها، مدیریت بستهها و محیطها و دسترسی به مستندات کمک کند.
📗ابزار virtualenv چیست؟
ابزار virtualenv یک ابزار است که به شما اجازه میدهد محیطهای پایتون جدا شده ایجاد کنید. از pip به عنوان مدیر بسته خود استفاده میکند که بستهها را از فهرست بسته پایتون (PyPI) نصب میکند. virtualenv یک ابزار خط فرمان است که نیاز به آشنایی با دستورات ترمینال دارد.
📘مزایا و معایب anaconda در مقابل virtualenv
این برخی از مزایا و معایب استفاده از anaconda در مقابل virtualenv هستند:
🔺ابزار anaconda فضای بیشتری از دیسک را در مقایسه با virtualenv اشغال میکند، زیرا با بسیاری از بستههایی که ممکن است نیاز یا استفاده نداشته باشید، همراه است. virtualenv به شما اجازه میدهد تنها بستههایی را که برای پروژه خود نیاز دارید نصب کنید، که میتواند فضا را صرفهجویی کند و تضادها را جلوگیری کند.
🔺ابزار anaconda میتواند محیطها و بستههای R را هم مدیریت کند، که میتواند مفید باشد اگر با هر دو زبان کار کنید. virtualenv تنها برای پایتون است و شما برای مدیریت محیطها و بستههای R به ابزار دیگری مانند رنو نیاز دارید.
🔺ابزار anaconda دارای یک رابط کاربری گرافیکی به نام ناوگان است که میتواند به مبتدیان و غیر برنامهنویسان در راهاندازی برنامهها، مدیریت بستهها و محیطها و دسترسی به مستندات کمک کند. virtualenv یک ابزار خط فرمان است که نیاز به آشنایی با دستورات ترمینال دارد.
🔺ابزار anaconda مناسبتر برای پروژههای علوم داده و نیاز به مجموعه گستردهای از بستههای از پیش نصب شده است. virtualenv انعطافپذیرتر است و به شما کنترل بیشتری بر روی نسخهها و بستههای پایتون میدهد.
📙چگونه بهترین ابزار را برای نیازهای خود انتخاب کنیم؟
تجربه کاربران ممکن است بسته به ترجیحات، نیازها و موارد استفادهشان متفاوت باشد. برخی از راهنماییهای عمومی عبارتند از:
🔺برای محیطهای حداقلی: اگر شما ترجیح میدهید محیطهای سبک و حداقلی داشته باشید، virtualenv انتخاب بهتری است .
🔺برای پروژههای علوم داده: اگر شما روی پروژههای علوم داده کار میکنید و نیاز به مجموعه گستردهای از بستههای از پیش نصب شده دارید، anaconda مناسبتر است .
🔺برای مبتدیان: اگر شما تازه به پایتون علاقهمند شدهاید و ترجیح میدهید یک رابط کاربری گرافیکی داشته باشید، ناوگان anaconda میتواند به شما کمک کند .
🔺برای کاربران پیشرفته: اگر شما با خط فرمان راحت هستید و میخواهید کنترل بیشتری بر روی نسخهها و بستههای پایتون داشته باشید، virtualenv انعطافپذیرتر است .
📝امیدوارl این پست به شما کمک کند تا مزایا و معایب استفاده از anaconda در مقابل virtualenv را بفهمید. اگر سوال یا نظری داشتید، لطفا بنویسید. 🙌
🔎 @py4ds
😁 چتجیپیتی برای اینکه بهتر جواب بده بهش وعده پول میدن😜
🐳 به نظرم اینم بد نیست که بهش بگی «اگر خوب بهم یاد بدی برات رزومه میشه» 😁😁😁😁
🔎 @py4ds
🐳 به نظرم اینم بد نیست که بهش بگی «اگر خوب بهم یاد بدی برات رزومه میشه» 😁😁😁😁
🔎 @py4ds
Media is too big
VIEW IN TELEGRAM
🧠شرکت OpenAI از اولین مدل متن به ویدیو خود به نام Sora رونمایی کرد.
🎬این مدل توانایی تولید ویدیوهایی تا حداکثر 60 ثانیه که صحنههای بسیار دقیق، حرکات پیچیده دوربین و شخصیتهای متعدد با احساسات پر جنب و جوش را نشان میدهد را دارد. درحال حاضر افراد بسیار کمی به این مدل دسترسی دارند که به زودی شاهد افزایش آن خواهیم بود.
📃 اطلاعات بیشتر
🔎 @py4ds
🎬این مدل توانایی تولید ویدیوهایی تا حداکثر 60 ثانیه که صحنههای بسیار دقیق، حرکات پیچیده دوربین و شخصیتهای متعدد با احساسات پر جنب و جوش را نشان میدهد را دارد. درحال حاضر افراد بسیار کمی به این مدل دسترسی دارند که به زودی شاهد افزایش آن خواهیم بود.
📃 اطلاعات بیشتر
🔎 @py4ds
مانی چند وقتیه که توی کانالش در مورد SQL به صورت تخصصی حرف میزنه، یک آموزشایی میده بهتون که سطح اعتماد به نفستون رو میاره زیر صفر، که چرا من اینا بلد نبودم، وای چرا من گند زدم تو پروژه ملت با این سوادم و ...
خلاصه که برید تو کانالش یاد بگیرید یکم با دیتابیس مهربون تر باشید و درست تر کوئری بزنید و بابای سرور رو از توی پورت هاش نکشید بیرون
کانالش :
@PyBackEndHub
من تخصص اصلیم nosql هستش و اگر دوست داشته باشید بعضی وقتا در مورد دیتابیس های سری زمانی صحبت کنم و سیستمشون رو یاد بدم بهتون
🔎 @py4ds
خلاصه که برید تو کانالش یاد بگیرید یکم با دیتابیس مهربون تر باشید و درست تر کوئری بزنید و بابای سرور رو از توی پورت هاش نکشید بیرون
کانالش :
@PyBackEndHub
من تخصص اصلیم nosql هستش و اگر دوست داشته باشید بعضی وقتا در مورد دیتابیس های سری زمانی صحبت کنم و سیستمشون رو یاد بدم بهتون
🔎 @py4ds
کار با Enum :
🔺از پایتون نسخه 3.4 Enum معرفی شده بود و در نسخهی 3.6 نیز Flag, IntEnum, auto معرفی شد.
📝 برای IntEnum
📝 برای Flag, auto
همچنین در نسخه 3.11 امکانات بیشتری بهش اضافه شد:
StrEnum, EnumCheck, ReprEnum, FlagBoundary, property, member, nonmember, global_enum, show_flag_values
🔎 @py4ds
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
# You can access the enum members using their names.
print(Color.RED) # Output: Color.RED
# You can also access them using their values.
print(Color(1)) # Output: Color.RED
# Enum members are hashable, so they can be used in dictionaries and sets.
my_dict = {Color.RED: 'red', Color.GREEN: 'green', Color.BLUE: 'blue'}
print(my_dict[Color.RED]) # Output: 'red'
🔺از پایتون نسخه 3.4 Enum معرفی شده بود و در نسخهی 3.6 نیز Flag, IntEnum, auto معرفی شد.
📝 برای IntEnum
from enum import IntEnum
class Shape(IntEnum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 3
print(Shape.CIRCLE == 1) # Output: True
📝 برای Flag, auto
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
print(Permission.READ | Permission.WRITE) # Output: Permission.READ|WRITE
همچنین در نسخه 3.11 امکانات بیشتری بهش اضافه شد:
StrEnum, EnumCheck, ReprEnum, FlagBoundary, property, member, nonmember, global_enum, show_flag_values
class Direction(ReprEnum):
NORTH = "↑ North"
EAST = "→ East"
SOUTH = "↓ South"
WEST = "← West"
print(Direction.NORTH) # Output: ↑ North
class Permissions(FlagBoundary):
READ = 1
WRITE = 2
EXECUTE = 4
user_permissions = Permissions.READ | Permissions.WRITE
print(user_permissions) # Output: Permissions.READ | Permissions.WRITE
def show_flag_values(enum_class, value):
for member in enum_class:
if member & value:
print(f"{member.name}: {member.value}")
permissions = Permissions.READ | Permissions.WRITE
show_flag_values(Permissions, permissions)
# Output:
# READ: 1
# WRITE: 2
🔎 @py4ds
Forwarded from Sadra Codes
نسخه 0.5 پایاکشن هم رلیز شد! 💫
پایاکشن یه ابزاره متنبازه که اجازه میده با استفاده از پایتون، گیتهاب اکشن بسازید!
توی این رلیز کلی اتفاق افتاده. پروژه دیگه یه تمپلیت ساده نیس و تبدیل شده به یه پکیج پایتون. علاوهبر بهترشدن داکیومنت و ساختار، یه فیچر خیلی خفن هم اضافه شده که واقعا استفاده از GitHub Issues رو یه لول میبره بالاتر!
این فیچر این قابلیت رو به شما میده تا از Issue Form گیتهاب بعنوان ساید فرانت اپ های پایتونتون استفاده کنید! این فیچر الان قابل استفاده هست و توتوریالش هم توی داکها قرارداده شده.
یک مثال که میتونید با پایاکشن پیاده کنید: فرض کنید که یک ریپو NLP دارید که برای Text Summaraization استفاده میشه و میخواید مردم این قابلیت رو داشته باشن که تستش کنن. به راحتی میتونید ساختاری رو طراحی کنید که هرشخص بتونه یک ایشو باز کنه و در ایشو، از ابزار شما استفاده کنه. (همهچیز اتوماتیک اتفاق میوفته)
💅 Issue Form feature: pyaction.imsadra.me/tutorial/#issueform
🟣 PyAction repo: github.com/lnxpy/pyaction
پایاکشن یه ابزاره متنبازه که اجازه میده با استفاده از پایتون، گیتهاب اکشن بسازید!
توی این رلیز کلی اتفاق افتاده. پروژه دیگه یه تمپلیت ساده نیس و تبدیل شده به یه پکیج پایتون. علاوهبر بهترشدن داکیومنت و ساختار، یه فیچر خیلی خفن هم اضافه شده که واقعا استفاده از GitHub Issues رو یه لول میبره بالاتر!
این فیچر این قابلیت رو به شما میده تا از Issue Form گیتهاب بعنوان ساید فرانت اپ های پایتونتون استفاده کنید! این فیچر الان قابل استفاده هست و توتوریالش هم توی داکها قرارداده شده.
یک مثال که میتونید با پایاکشن پیاده کنید: فرض کنید که یک ریپو NLP دارید که برای Text Summaraization استفاده میشه و میخواید مردم این قابلیت رو داشته باشن که تستش کنن. به راحتی میتونید ساختاری رو طراحی کنید که هرشخص بتونه یک ایشو باز کنه و در ایشو، از ابزار شما استفاده کنه. (همهچیز اتوماتیک اتفاق میوفته)
💅 Issue Form feature: pyaction.imsadra.me/tutorial/#issueform
🟣 PyAction repo: github.com/lnxpy/pyaction
Forwarded from Go Casts 🚀
به دنبال ساختار باشید و نه چارچوب
چند روز پیش یه مربی کودک یه حرف خیلی مهمی زد با این مفهوم: «ما اینجا برای بچه ها ساختار تعیین می کنیم نه چارچوب، چارچوب یعنی حد و مرز!»
این جمله رو باید قاب کرد و زد رو دیوار، احتمالا در ابعاد خیلی زیادی از زندگی مهم باشه. در مهندسی نرم افزار و توسعه محصول هم خیلی حرف مهمیه.
بیشتر اوقات ما دنبال چارچوب هستیم در مهندسی نرم افزار، به همین دلیل وقتی خودمون رو به یه چارچوب خاص محدود می کنیم با چالش های زیادی روبرو میشیم. در حالیکه بهتره ما برای توسعه محصول ساختار داشته باشیم و طبق اصول ساختاری کار رو پیش ببریم، اینطوری چالش مون کمتر میشه.
اجازه بدید برداشت خودم از چارچوب و ساختار رو کمی بیشتر باز کنم. ساختار میشه مجموعه از قواعد رفتاری که باید سعی کنیم در توسعه محصول بهشون پایبند باشیم، در مقابل، چارچوب میشه تعیین کردن یه سری حد و مرز مشخص به شیوه ای سختگیرانه.
مثلا اگه بخوام برای توسعه یک سرویس ساختار تعیین کنم احتمالا میگم: این سرویس باید توان پاسخگویی بالایی داشته باشه، در مقابل خطا مقاوم باشه، قابلیت مقیاس پذیری داشته باشه، یک قرارداد ساده و شفاف به کلاینت ها ارائه بده و مواردی از این دست.
اما اگه بخوام چارچوب برای سرویس تعیین کنم احتمالا میگم: ما باید از ساختار کد مبتنی بر clean code یا ddd در فلان repository که خودمون یا دیگران اونو نوشتن پیروی کنیم، باید همه ورودی هارو تو پوشه port قرار بدیم، باید همه مدل هامون تو پوشه models باشه، باید از فلان روش ci/cd استفاده کنیم.
در توسعه محصول تعیین کردن حد و مرز و چارچوب میتونه خوب باشه، اما بشرطی که تعیین این حد و مرز تنها زمان پیاده سازی سرویس باشه و متعهد بشیم که کورکورانه و سختگیرانه نخوایم این چارچوب رو به همه سرویس ها و محصولات تحمیل کنیم.
خیلی از practiceهایی که معروف شدند مثل clean code و ddd و tdd و غیره هم از نظر من بیشتر به دنبال این هستند که به شما کمک کنند که برای کارتون ساختار تعیین کنید. در حالیکه اشتباهی که زیاد رخ میده اینه که ما با خوندن این مطالب احتمالا بیشتر به سمت درآوردن چارچوب میریم... همه ش به دنبال این هستیم که مثلا یه boilerplate داشته باشیم که از clean code پیروی کنه و همون رو همه جا استفاده کنیم.
من گاها به دوستان متذکر میشم که خوندن این الگوها و منابع خیلی خوبه، به شرطی که شما سعی کنی جان کلام و دغدغه اصلی رو متوجه بشی، نه اینکه سعی کنی به دنبال یک راه حل فست فودی و چارچوب مشخص و معین باشی که کورکورانه همه جا ازش استفاده کنی.
شما وقتی برای کارت ساختار داشته باشی میتونی انعطاف پذیر باشی و بسته به نیازت چارچوب تعیین کنی، اما اگه بخوای یه چارچوب معین رو همه جا رعایت کنی احتمالا یه جاهایی اصول ساختاری خودت رو مجبور میشی زیر پا بذاری چون هیچ چارچوب واحدی وجود نداره که برای همه نیازها مناسب باشه.
@gocasts
چند روز پیش یه مربی کودک یه حرف خیلی مهمی زد با این مفهوم: «ما اینجا برای بچه ها ساختار تعیین می کنیم نه چارچوب، چارچوب یعنی حد و مرز!»
این جمله رو باید قاب کرد و زد رو دیوار، احتمالا در ابعاد خیلی زیادی از زندگی مهم باشه. در مهندسی نرم افزار و توسعه محصول هم خیلی حرف مهمیه.
بیشتر اوقات ما دنبال چارچوب هستیم در مهندسی نرم افزار، به همین دلیل وقتی خودمون رو به یه چارچوب خاص محدود می کنیم با چالش های زیادی روبرو میشیم. در حالیکه بهتره ما برای توسعه محصول ساختار داشته باشیم و طبق اصول ساختاری کار رو پیش ببریم، اینطوری چالش مون کمتر میشه.
اجازه بدید برداشت خودم از چارچوب و ساختار رو کمی بیشتر باز کنم. ساختار میشه مجموعه از قواعد رفتاری که باید سعی کنیم در توسعه محصول بهشون پایبند باشیم، در مقابل، چارچوب میشه تعیین کردن یه سری حد و مرز مشخص به شیوه ای سختگیرانه.
مثلا اگه بخوام برای توسعه یک سرویس ساختار تعیین کنم احتمالا میگم: این سرویس باید توان پاسخگویی بالایی داشته باشه، در مقابل خطا مقاوم باشه، قابلیت مقیاس پذیری داشته باشه، یک قرارداد ساده و شفاف به کلاینت ها ارائه بده و مواردی از این دست.
اما اگه بخوام چارچوب برای سرویس تعیین کنم احتمالا میگم: ما باید از ساختار کد مبتنی بر clean code یا ddd در فلان repository که خودمون یا دیگران اونو نوشتن پیروی کنیم، باید همه ورودی هارو تو پوشه port قرار بدیم، باید همه مدل هامون تو پوشه models باشه، باید از فلان روش ci/cd استفاده کنیم.
در توسعه محصول تعیین کردن حد و مرز و چارچوب میتونه خوب باشه، اما بشرطی که تعیین این حد و مرز تنها زمان پیاده سازی سرویس باشه و متعهد بشیم که کورکورانه و سختگیرانه نخوایم این چارچوب رو به همه سرویس ها و محصولات تحمیل کنیم.
خیلی از practiceهایی که معروف شدند مثل clean code و ddd و tdd و غیره هم از نظر من بیشتر به دنبال این هستند که به شما کمک کنند که برای کارتون ساختار تعیین کنید. در حالیکه اشتباهی که زیاد رخ میده اینه که ما با خوندن این مطالب احتمالا بیشتر به سمت درآوردن چارچوب میریم... همه ش به دنبال این هستیم که مثلا یه boilerplate داشته باشیم که از clean code پیروی کنه و همون رو همه جا استفاده کنیم.
من گاها به دوستان متذکر میشم که خوندن این الگوها و منابع خیلی خوبه، به شرطی که شما سعی کنی جان کلام و دغدغه اصلی رو متوجه بشی، نه اینکه سعی کنی به دنبال یک راه حل فست فودی و چارچوب مشخص و معین باشی که کورکورانه همه جا ازش استفاده کنی.
شما وقتی برای کارت ساختار داشته باشی میتونی انعطاف پذیر باشی و بسته به نیازت چارچوب تعیین کنی، اما اگه بخوای یه چارچوب معین رو همه جا رعایت کنی احتمالا یه جاهایی اصول ساختاری خودت رو مجبور میشی زیر پا بذاری چون هیچ چارچوب واحدی وجود نداره که برای همه نیازها مناسب باشه.
@gocasts
Forwarded from 🧑💻PythonDev🧑💻
✅ هر وقت صحبت از شیء گرایی و ارث بری میشه پای Mixin هم میاد وسط. اما دقیقا چیه؟ Mixin توی پایتون یک الگو هستش و کدهایی که از این الگو بهره میبرند کلمهی کلیدی خاصی یا چیز اضافهتری ندارند. فرض کنین ما میخواهیم یک متد جدید به یک کلاس اضافه کنیم تا
مثلا کلاسهای زیر رو در نظر بگیرید.
حالا نیاز داریم که متد play music رو هم به این کلاس ها اضافه کنیم، دوتا راه داریم. اولیش اینه که:
اما یک ایرادی وجود داره. اینجا خودمون رو تکرار کردیم. درواقع اومدیم دوبار یک تکه کد رو تکرار کردیم و این از نظر کدینگ وجه خوبی نداره. پس این راه حل ما نیست.
روش دوم اینه بیایم به بیس کلاسمون یعنی Vehicle یک متد تحت عنوان play_music اضافه کنیم.
اما در این صورت کلاس موتورسیکلت هم دارای رفتار پخش موزیک خواهد شد و این اشتباه است. اینجا است که Mixin خودش رو نشون میده. به کد زیر توجه کنید.
درواقع از کلاس PlayMusicMixin قرار نیست هیچ شیٔ ای ساخته شود و صرفا مهم این است که کارایی کلاسهای خاصی را افزایش شود.
پ.ن: اون کلمهی Mixin انتهای اسم کلاس هم قراردادیه، بهتره نوشته بشه ولی اجبار نداره.
کارایی
یا Functionality اون رو زیاد کنیم. اینجا میشه از Mixin استفاده کرد.مثلا کلاسهای زیر رو در نظر بگیرید.
class Vehicle:
pass
class Car(Vehicle):
pass
class Van(Vehicle):
pass
class Motorcycle(Vehicle):
pass
حالا نیاز داریم که متد play music رو هم به این کلاس ها اضافه کنیم، دوتا راه داریم. اولیش اینه که:
class Vehicle:
pass
class Car(Vehicle):
def play_music(self):
print("play_music")
class Van(Vehicle):
def play_music(self):
print("play_music")
class Motorcycle(Vehicle):
pass
اما یک ایرادی وجود داره. اینجا خودمون رو تکرار کردیم. درواقع اومدیم دوبار یک تکه کد رو تکرار کردیم و این از نظر کدینگ وجه خوبی نداره. پس این راه حل ما نیست.
روش دوم اینه بیایم به بیس کلاسمون یعنی Vehicle یک متد تحت عنوان play_music اضافه کنیم.
class Vehicle:
def play_music(self):
print("play_music")
class Car(Vehicle):
pass
class Van(Vehicle):
pass
class Motorcycle(Vehicle):
pass
اما در این صورت کلاس موتورسیکلت هم دارای رفتار پخش موزیک خواهد شد و این اشتباه است. اینجا است که Mixin خودش رو نشون میده. به کد زیر توجه کنید.
class Vehicle:
pass
class PlayMusicMixin:
def play_music(self):
print("play_music")
class Car(Vehicle, PlayMusicMixin):
pass
class Van(Vehicle, PlayMusicMixin):
pass
class Motorcycle(Vehicle):
pass
درواقع از کلاس PlayMusicMixin قرار نیست هیچ شیٔ ای ساخته شود و صرفا مهم این است که کارایی کلاسهای خاصی را افزایش شود.
پ.ن: اون کلمهی Mixin انتهای اسم کلاس هم قراردادیه، بهتره نوشته بشه ولی اجبار نداره.