بسیار مبهم توضیح دادن میتونستن از مثال shape استفاده کنن به اینصورت که اگر بر فرض ما بخوایم دایره رو مساحتش رو حساب کنیم چه کار باید انجام دهیم به نظر من اصلا توضیح واضحی نبود من بودم یه اینترفیس shapeدرست میکردم
تو این اینترفیس هم یه متد قرار میدادم مثل getArea که بیاد مساحت رو محاسبه کنه حالا تو هر کلاسی که ایجاد میکنی میتونی اینو جدا محاسبه کنی
بسیار مبهم توضیح دادن میتونستن از مثال shape استفاده کنن به اینصورت که اگر بر فرض ما بخوایم دایره رو مساحتش رو حساب کنیم چه کار باید انجام دهیم به نظر من اصلا توضیح واضحی نبود من بودم یه اینترفیس shapeدرست میکردم
تو این اینترفیس هم یه متد قرار میدادم مثل getArea که بیاد مساحت رو محاسبه کنه حالا تو هر کلاسی که ایجاد میکنی میتونی اینو جدا محاسبه کنی
ممنون ازتوضیح خوبتون.
یک سؤال دارم و این که ابتدای نوشته توضیح دادید که ((همچنین لازم به یادآوری است که MySQLConnection یک ماژول سطح پایین است در حالی که کلاس Content یک ماژول سطح بالا تلقی میگردد))، سؤال من اینه که ماژول سطح پایین و بالا را چهطور میشه تشخیص داد؟ این برام یکم جا نیفتاده😇
ممنون ازتوضیح خوبتون.
یک سؤال دارم و این که ابتدای نوشته توضیح دادید که ((همچنین لازم به یادآوری است که MySQLConnection یک ماژول سطح پایین است در حالی که کلاس Content یک ماژول سطح بالا تلقی میگردد))، سؤال من اینه که ماژول سطح پایین و بالا را چهطور میشه تشخیص داد؟ این برام یکم جا نیفتاده😇
ممنون ازتوضیح خوبتون.
یک سؤال دارم و این که ابتدای نوشته توضیح دادید که ((همچنین لازم به یادآوری است که MySQLConnection یک ماژول سطح پایین است در حالی که کلاس Content یک ماژول سطح بالا تلقی میگردد))، سؤال من اینه که ماژول سطح پایین و بالا را چهطور میشه تشخیص داد؟ این برام یکم جا نیفتاده😇
ماژولهای سطح بالا معمولا وظیفه مدیریت business logic و تصمیمگیریهای اصلی سیستم را دارند و به انتزاعها وابستهاند، در حالی که ماژولهای سطح پایین وظایف فنی تر و جزئی مانند کار با پایگاه داده، فایلها، یا شبکه را دارن.
برای تشخیص هم، مثلا میشه گفت: ماژولی که به منطق اصلی و business logic نزدیکتره سطح بالا و ماژولی که بیشتر با منابع و سرویس های خارجی کار میکنه سطح پایین محسوب میشود.
ماژولهای سطح بالا معمولا وظیفه مدیریت business logic و تصمیمگیریهای اصلی سیستم را دارند و به انتزاعها وابستهاند، در حالی که ماژولهای سطح پایین وظایف فنی تر و جزئی مانند کار با پایگاه داده، فایلها، یا شبکه را دارن.
برای تشخیص هم، مثلا میشه گفت: ماژولی که به منطق اصلی و business logic نزدیکتره سطح بالا و ماژولی که بیشتر با منابع و سرویس های خارجی کار میکنه سطح پایین محسوب میشود.
با تشکر از نویسنده عزیز. مثال خوب و متداولیه برای بیان این قانون اما مثال درست تبیین نشده. لطفا به این لینک یه نگاهی بندازین.
https://stackoverflow.com/a/584732/4578899
با تشکر از نویسنده عزیز. مثال خوب و متداولیه برای بیان این قانون اما مثال درست تبیین نشده. لطفا به این لینک یه نگاهی بندازین.
https://stackoverflow.com/a/584732/4578899
در انتها لزومی به تغییر متدهای کلاس مربع نبود. یعنی؛ با توجه به تعریف یک (رابط) چهارضلعی و این که کلاسهای مستطیل و مربع از آن مشتق شدهاند، اصل سوم SOLID نیز رعایت میگردد، چرا که دیگر مربع فرزند مستطیل در نظر گرفته نشده است، و بدین ترتیب هیچکدام از فرزندان، رفتار والد خود را نقض نمیکنند.
در انتها لزومی به تغییر متدهای کلاس مربع نبود. یعنی؛ با توجه به تعریف یک (رابط) چهارضلعی و این که کلاسهای مستطیل و مربع از آن مشتق شدهاند، اصل سوم SOLID نیز رعایت میگردد، چرا که دیگر مربع فرزند مستطیل در نظر گرفته نشده است، و بدین ترتیب هیچکدام از فرزندان، رفتار والد خود را نقض نمیکنند.
خیلی عجیبه
درعین حالی که سایر قوانین خوب بیان شده بود این اصلا مثال خوبی نداشت.
یعنی چی مربع یه ضلعش 2 و ضلع دیگش 3 باشه. مگه داریم چنین چیزی؟ در ثانی دوتا کلاس عین هم یعنی چی آخه؟ فقط اسم کلاسشون متفاوته
خیلی عجیبه
درعین حالی که سایر قوانین خوب بیان شده بود این اصلا مثال خوبی نداشت.
یعنی چی مربع یه ضلعش 2 و ضلع دیگش 3 باشه. مگه داریم چنین چیزی؟ در ثانی دوتا کلاس عین هم یعنی چی آخه؟ فقط اسم کلاسشون متفاوته
تا اونجایی که من فهمیدم این اصل رو باید زمانی که یک کلاس می خواد یک عمل خاص رو به روش های مختلف انجام بده مد نظر قرار بدیم .
مثلا در این تمرین عمل لاگین به روش های مختلف انجام می شه
تا اونجایی که من فهمیدم این اصل رو باید زمانی که یک کلاس می خواد یک عمل خاص رو به روش های مختلف انجام بده مد نظر قرار بدیم .
مثلا در این تمرین عمل لاگین به روش های مختلف انجام می شه
سلام.<br />مگه شما نمیگید مربع؟ مربع فقط یه طول ضلع داره. در واقع مستطیلیه که طول و عرضش برابره. اگر ضلعش 2 باشه مساحت 4 میشه و اگر ضلعش 3 باشه مساحت 9 میشه. چه اصراری دارید که مساحت 6 بشه. این برنامه‌ایراد داره! شاید اشکال توی انتخاب مثال هست.
سلام.<br />مگه شما نمیگید مربع؟ مربع فقط یه طول ضلع داره. در واقع مستطیلیه که طول و عرضش برابره. اگر ضلعش 2 باشه مساحت 4 میشه و اگر ضلعش 3 باشه مساحت 9 میشه. چه اصراری دارید که مساحت 6 بشه. این برنامه‌ایراد داره! شاید اشکال توی انتخاب مثال هست.
سلام.<br />مگه شما نمیگید مربع؟ مربع فقط یه طول ضلع داره. در واقع مستطیلیه که طول و عرضش برابره. اگر ضلعش 2 باشه مساحت 4 میشه و اگر ضلعش 3 باشه مساحت 9 میشه. چه اصراری دارید که مساحت 6 بشه. این برنامه‌ایراد داره! شاید اشکال توی انتخاب مثال هست.
منم فکر می کنم مثال باعث شده فهم مسئله به خوبی صورت نگیره.
منهم این ابهام و سؤال شما رو دارم.
اگه آقا بهزاد این موضع رو یکم توضیح بدن یا برای فهم بهتر مسئله مثال دیگه ای زده شه بهتره
منم فکر می کنم مثال باعث شده فهم مسئله به خوبی صورت نگیره.
منهم این ابهام و سؤال شما رو دارم.
اگه آقا بهزاد این موضع رو یکم توضیح بدن یا برای فهم بهتر مسئله مثال دیگه ای زده شه بهتره
سلام.<br />مگه شما نمیگید مربع؟ مربع فقط یه طول ضلع داره. در واقع مستطیلیه که طول و عرضش برابره. اگر ضلعش 2 باشه مساحت 4 میشه و اگر ضلعش 3 باشه مساحت 9 میشه. چه اصراری دارید که مساحت 6 بشه. این برنامه‌ایراد داره! شاید اشکال توی انتخاب مثال هست.
نه مساله اینه که این اصل LSP میگه یه کلاس فرزند باید دقیقا ورودی و خروجی برابر با والدش داشته باشه. یعنی در این مثال که کلاس مربع از کلاس مستطیل ارثبری کرده، کلاس فرزند (مربع) میباید عینا مطابق با توانایی کلاس والد بتونه مساحت یک مستطیل رو بدون اشتباه انجام بده. اما در مثالی که ناقض LSP هست در کلاس مربع هر بار که مقداری به طول یا عرض داده می شه هر دو بعد مربع/مستطیل مقدار دهی میشه که خروجی area در اینجا میشه a^2 که این فرمول نمیتونه برای محاسبه محیط مستطیل استفاده بشه.
نه مساله اینه که این اصل LSP میگه یه کلاس فرزند باید دقیقا ورودی و خروجی برابر با والدش داشته باشه. یعنی در این مثال که کلاس مربع از کلاس مستطیل ارثبری کرده، کلاس فرزند (مربع) میباید عینا مطابق با توانایی کلاس والد بتونه مساحت یک مستطیل رو بدون اشتباه انجام بده. اما در مثالی که ناقض LSP هست در کلاس مربع هر بار که مقداری به طول یا عرض داده می شه هر دو بعد مربع/مستطیل مقدار دهی میشه که خروجی area در اینجا میشه a^2 که این فرمول نمیتونه برای محاسبه محیط مستطیل استفاده بشه.
نه مساله اینه که این اصل LSP میگه یه کلاس فرزند باید دقیقا ورودی و خروجی برابر با والدش داشته باشه. یعنی در این مثال که کلاس مربع از کلاس مستطیل ارثبری کرده، کلاس فرزند (مربع) میباید عینا مطابق با توانایی کلاس والد بتونه مساحت یک مستطیل رو بدون اشتباه انجام بده. اما در مثالی که ناقض LSP هست در کلاس مربع هر بار که مقداری به طول یا عرض داده می شه هر دو بعد مربع/مستطیل مقدار دهی میشه که خروجی area در اینجا میشه a^2 که این فرمول نمیتونه برای محاسبه محیط مستطیل استفاده بشه.
ولی در این مثال تو قسمت دوم هنگام استفاده از اینترفیس ها دیگه نیومده مربعو از مستطیل مشتق کنه
ولی در این مثال تو قسمت دوم هنگام استفاده از اینترفیس ها دیگه نیومده مربعو از مستطیل مشتق کنه
سلام
ممنون از این دوره آموزشی.
سؤالی برای من بوجود اومده و اون هم اینکه در یک اپ واقعی فهمین و تعیین کردنِ اینکه کاربر میخواهد بصورت NormalUser لاگین کند و یا GmailUser، خودش نیاز به if و else دارد (تا بفهمیم بین NormalUser و GmailUser از کدام باید نمونه گرفته و به متد لاگین پاس دهیم).
آیا این ناقض همین اصلِ Open Close نیست ؟
سلام
ممنون از این دوره آموزشی.
سؤالی برای من بوجود اومده و اون هم اینکه در یک اپ واقعی فهمین و تعیین کردنِ اینکه کاربر میخواهد بصورت NormalUser لاگین کند و یا GmailUser، خودش نیاز به if و else دارد (تا بفهمیم بین NormalUser و GmailUser از کدام باید نمونه گرفته و به متد لاگین پاس دهیم).
آیا این ناقض همین اصلِ Open Close نیست ؟
سلام
ممنون از این دوره آموزشی.
سؤالی برای من بوجود اومده و اون هم اینکه در یک اپ واقعی فهمین و تعیین کردنِ اینکه کاربر میخواهد بصورت NormalUser لاگین کند و یا GmailUser، خودش نیاز به if و else دارد (تا بفهمیم بین NormalUser و GmailUser از کدام باید نمونه گرفته و به متد لاگین پاس دهیم).
آیا این ناقض همین اصلِ Open Close نیست ؟
سلام
ب اساس توضیحات بالا روشی که شما گفتین که در کد های بالا هم قابلمشاهده هست open close رو نقض میکنه :
\" زیرا ما برای آنکه فیچرهای جدیدی به ماژول خود اضافه کنیم، داخل کدهای قبلی دست بردهایم و این در حالی است که این اصل ما را موظف میکند که به گونهای کد بزنیم تا بدون آنکه کدهای قبلی دستخوش تغییر شوند، قابلیتهای جدید به آن افزوده گردد. \"
سلام
ب اساس توضیحات بالا روشی که شما گفتین که در کد های بالا هم قابلمشاهده هست open close رو نقض میکنه :
\" زیرا ما برای آنکه فیچرهای جدیدی به ماژول خود اضافه کنیم، داخل کدهای قبلی دست بردهایم و این در حالی است که این اصل ما را موظف میکند که به گونهای کد بزنیم تا بدون آنکه کدهای قبلی دستخوش تغییر شوند، قابلیتهای جدید به آن افزوده گردد. \"
سلام
ممنون از این دوره آموزشی.
سؤالی برای من بوجود اومده و اون هم اینکه در یک اپ واقعی فهمین و تعیین کردنِ اینکه کاربر میخواهد بصورت NormalUser لاگین کند و یا GmailUser، خودش نیاز به if و else دارد (تا بفهمیم بین NormalUser و GmailUser از کدام باید نمونه گرفته و به متد لاگین پاس دهیم).
آیا این ناقض همین اصلِ Open Close نیست ؟
سلام
تا اونجایی که من فهمیدم این اصل و اصل های دیگه SOLID در هنگام ایجاد یک کلاس باید مد نظر قرار گرفته بشن .
مثلا در همین مثال شما هیچ وقت قسمت لاگین با اکانت Gmail رو دیگه نیاز نیست تغییر بدید هرچند بخواهید انواع دیگه لاگین هم به برنامه اضافه کنید . اما توجه داریم بالاخره source برنامه باید تغییر کنه . اما این تغییر سبب اصلاح ویژگیهای قبلی کد ما نمی شه بلکه ویژگی جدیدی به کد اضافه می کنه .
سلام
تا اونجایی که من فهمیدم این اصل و اصل های دیگه SOLID در هنگام ایجاد یک کلاس باید مد نظر قرار گرفته بشن .
مثلا در همین مثال شما هیچ وقت قسمت لاگین با اکانت Gmail رو دیگه نیاز نیست تغییر بدید هرچند بخواهید انواع دیگه لاگین هم به برنامه اضافه کنید . اما توجه داریم بالاخره source برنامه باید تغییر کنه . اما این تغییر سبب اصلاح ویژگیهای قبلی کد ما نمی شه بلکه ویژگی جدیدی به کد اضافه می کنه .
سلام
ممنون از این دوره آموزشی.
سؤالی برای من بوجود اومده و اون هم اینکه در یک اپ واقعی فهمین و تعیین کردنِ اینکه کاربر میخواهد بصورت NormalUser لاگین کند و یا GmailUser، خودش نیاز به if و else دارد (تا بفهمیم بین NormalUser و GmailUser از کدام باید نمونه گرفته و به متد لاگین پاس دهیم).
آیا این ناقض همین اصلِ Open Close نیست ؟
سلام به نظر من منظور اینه که دست تو فرایند نبریم حالا بالاخره یک فیچری اضافه میشه بالاخره باید از یک جایی صدا زده بشه که قطعا وقتی هر کاری یک روت مختلف داشته باشه دیگه شرط نیازی نیست بنویسید
سلام به نظر من منظور اینه که دست تو فرایند نبریم حالا بالاخره یک فیچری اضافه میشه بالاخره باید از یک جایی صدا زده بشه که قطعا وقتی هر کاری یک روت مختلف داشته باشه دیگه شرط نیازی نیست بنویسید
بسیار مبهم توضیح دادن میتونستن از مثال shape استفاده کنن به اینصورت که اگر بر فرض ما بخوایم دایره رو مساحتش رو حساب کنیم چه کار باید انجام دهیم به نظر من اصلا توضیح واضحی نبود من بودم یه اینترفیس shapeدرست میکردم تو این اینترفیس هم یه متد قرار میدادم مثل getArea که بیاد مساحت رو محاسبه کنه حالا تو هر کلاسی که ایجاد میکنی میتونی اینو جدا محاسبه کنی
احتمالا زمان نوشتن این مطلب تمرکز لازم رو نداشتن. مطالب قبلیشون انقدر پر و پیمون بوده که بشه از این اشکال چشم پوشی کرد. امیدوارم اصلاح بشه.
سلام. مقاله به روز رسانی و اصلاح شد.
مگر میشود طول و عرض مربع برابر نباشد 2*3 ؟ باید جواب بشه 9 یا چهار. منظورم اخرین مقاله است
سلام و خسته نباشید.ممنون از آموزش خیلی خوبتون
ممنون ازتوضیح خوبتون. یک سؤال دارم و این که ابتدای نوشته توضیح دادید که ((همچنین لازم به یادآوری است که MySQLConnection یک ماژول سطح پایین است در حالی که کلاس Content یک ماژول سطح بالا تلقی میگردد))، سؤال من اینه که ماژول سطح پایین و بالا را چهطور میشه تشخیص داد؟ این برام یکم جا نیفتاده😇
ماژولهای سطح بالا معمولا وظیفه مدیریت business logic و تصمیمگیریهای اصلی سیستم را دارند و به انتزاعها وابستهاند، در حالی که ماژولهای سطح پایین وظایف فنی تر و جزئی مانند کار با پایگاه داده، فایلها، یا شبکه را دارن. برای تشخیص هم، مثلا میشه گفت: ماژولی که به منطق اصلی و business logic نزدیکتره سطح بالا و ماژولی که بیشتر با منابع و سرویس های خارجی کار میکنه سطح پایین محسوب میشود.
این دوره بسیار عالی و در عین سادگی بسیار کاربردی توضیح داده شده بود.
با تشکر از نویسنده عزیز. مثال خوب و متداولیه برای بیان این قانون اما مثال درست تبیین نشده. لطفا به این لینک یه نگاهی بندازین. https://stackoverflow.com/a/584732/4578899
بسیار عالی ممنون از مطالب مفیدتون
مثال ایراد داره واقعا
بسیار ممنون از مقاله شما . اما متأسفانه مثال خوبی در بحث مطرح نشده.
در انتها لزومی به تغییر متدهای کلاس مربع نبود. یعنی؛ با توجه به تعریف یک (رابط) چهارضلعی و این که کلاسهای مستطیل و مربع از آن مشتق شدهاند، اصل سوم SOLID نیز رعایت میگردد، چرا که دیگر مربع فرزند مستطیل در نظر گرفته نشده است، و بدین ترتیب هیچکدام از فرزندان، رفتار والد خود را نقض نمیکنند.
خیلی عجیبه درعین حالی که سایر قوانین خوب بیان شده بود این اصلا مثال خوبی نداشت. یعنی چی مربع یه ضلعش 2 و ضلع دیگش 3 باشه. مگه داریم چنین چیزی؟ در ثانی دوتا کلاس عین هم یعنی چی آخه؟ فقط اسم کلاسشون متفاوته
خوب الان بدتر شد که دوتا کلاس با کدهای عینا\" مثل هم داریم، دو کلاس Rectangle و Square عین همن!! ؟؟؟
تا اونجایی که من فهمیدم این اصل رو باید زمانی که یک کلاس می خواد یک عمل خاص رو به روش های مختلف انجام بده مد نظر قرار بدیم . مثلا در این تمرین عمل لاگین به روش های مختلف انجام می شه
توی این مثال آیا قانون OCP نقض نشده
آخرش هم که اشتباه شد یعنی ۳ و ۲ قرار دادین. من نفهمیدم اخرش رو
سلام.<br />مگه شما نمیگید مربع؟ مربع فقط یه طول ضلع داره. در واقع مستطیلیه که طول و عرضش برابره. اگر ضلعش 2 باشه مساحت 4 میشه و اگر ضلعش 3 باشه مساحت 9 میشه. چه اصراری دارید که مساحت 6 بشه. این برنامه‌ایراد داره! شاید اشکال توی انتخاب مثال هست.
منم فکر می کنم مثال باعث شده فهم مسئله به خوبی صورت نگیره. منهم این ابهام و سؤال شما رو دارم. اگه آقا بهزاد این موضع رو یکم توضیح بدن یا برای فهم بهتر مسئله مثال دیگه ای زده شه بهتره
نه مساله اینه که این اصل LSP میگه یه کلاس فرزند باید دقیقا ورودی و خروجی برابر با والدش داشته باشه. یعنی در این مثال که کلاس مربع از کلاس مستطیل ارثبری کرده، کلاس فرزند (مربع) میباید عینا مطابق با توانایی کلاس والد بتونه مساحت یک مستطیل رو بدون اشتباه انجام بده. اما در مثالی که ناقض LSP هست در کلاس مربع هر بار که مقداری به طول یا عرض داده می شه هر دو بعد مربع/مستطیل مقدار دهی میشه که خروجی area در اینجا میشه a^2 که این فرمول نمیتونه برای محاسبه محیط مستطیل استفاده بشه.
ولی در این مثال تو قسمت دوم هنگام استفاده از اینترفیس ها دیگه نیومده مربعو از مستطیل مشتق کنه
سلام ممنون از این دوره آموزشی. سؤالی برای من بوجود اومده و اون هم اینکه در یک اپ واقعی فهمین و تعیین کردنِ اینکه کاربر میخواهد بصورت NormalUser لاگین کند و یا GmailUser، خودش نیاز به if و else دارد (تا بفهمیم بین NormalUser و GmailUser از کدام باید نمونه گرفته و به متد لاگین پاس دهیم). آیا این ناقض همین اصلِ Open Close نیست ؟
سلام ب اساس توضیحات بالا روشی که شما گفتین که در کد های بالا هم قابلمشاهده هست open close رو نقض میکنه : \" زیرا ما برای آنکه فیچرهای جدیدی به ماژول خود اضافه کنیم، داخل کدهای قبلی دست بردهایم و این در حالی است که این اصل ما را موظف میکند که به گونهای کد بزنیم تا بدون آنکه کدهای قبلی دستخوش تغییر شوند، قابلیتهای جدید به آن افزوده گردد. \"
سلام تا اونجایی که من فهمیدم این اصل و اصل های دیگه SOLID در هنگام ایجاد یک کلاس باید مد نظر قرار گرفته بشن . مثلا در همین مثال شما هیچ وقت قسمت لاگین با اکانت Gmail رو دیگه نیاز نیست تغییر بدید هرچند بخواهید انواع دیگه لاگین هم به برنامه اضافه کنید . اما توجه داریم بالاخره source برنامه باید تغییر کنه . اما این تغییر سبب اصلاح ویژگیهای قبلی کد ما نمی شه بلکه ویژگی جدیدی به کد اضافه می کنه .
سلام به نظر من منظور اینه که دست تو فرایند نبریم حالا بالاخره یک فیچری اضافه میشه بالاخره باید از یک جایی صدا زده بشه که قطعا وقتی هر کاری یک روت مختلف داشته باشه دیگه شرط نیازی نیست بنویسید