View Full Version : گفتگو: شی گرایی؟
developing
یک شنبه 24 مرداد 1389, 19:51 عصر
با سلام.
عنوان رو که نوشتم دنیای بزرگیه. اینقدر که من هنوز نمیتونم بگم که چه برنامهای شیگراست و چه برنامهای نیست. خب مقدمه رو کم کنم من چند تا سوال دارم در مورد شیگرایی که در پایین نوشتم دوستان لطف کنند در این مورد یه کم بحث کنیم تا من هم دانشم افزایش پیدا کنه.
قبل از اون از علی آقا کشاورز خواهش میکنم که اگه من تاپیک رو بد جایی باز کردم خودشون زحمت تغییر جاش رو بدن( ولی چون من اصولا برنامهنویس دلفی هستم مسلما آدرس این بخش رو راحت تر به یاد میسپارم.)
1- چه برنامهای رو میگن شیگرا( یعنی برنامهی مخلوط از ساختیافته و شیگرا رو هم میتونیم به نوعی شیگرا بدونیم)
2- چطور دید شیگرا پیدا کنیم.( من الان بعد از چندین سال برنامهنویسی تازه فهمیدم که کد ساختیافته چیه و میتونم برنامهی تقریبا نه کامل ساختیافته بنویسم ولی هنوز تو مفاهیم شیگرایی موندم)
3- شیگرایی واقعا چقدر متفاوته با برنامهنویسی تابعی؟
دوستان قبل از پاسخ این رو بگم که من هم لیسانس کامپیوتر دارم ،هم اینکه تجربه تدریس و برنامهنویسی توی شرکت. پس از لغات و کتاب ها مثال نیارید و واقعا تجربیات خودتون رو بنویسید.
با تشکر فراوان
مصطفی ساتکی
یک شنبه 24 مرداد 1389, 21:47 عصر
2- چطور دید شیگرا پیدا کنیم.( من الان بعد از چندین سال برنامهنویسی تازه فهمیدم که کد ساختیافته چیه و میتونم برنامهی تقریبا نه کامل ساختیافته بنویسم ولی هنوز تو مفاهیم شیگرایی موندم)
شما بايستي تو زمينه Design Pattern مطالعه كنيد تا اصول و قواعد حاكم رو ياد بگيريد شايد بعضي از مفاهيم در هنگامي يادگيري OO رو به ذهن داشته باشيد در Design Pattern به چرايي همه اين مسايل پرداخته ميشه.
گفتگوي فني هم كه تو سايت برگزار شد مطالعه اون ميتونه بهتون كمك كنه .
vcldeveloper
دوشنبه 25 مرداد 1389, 01:58 صبح
چه برنامهای رو میگن شیگرا( یعنی برنامهی مخلوط از ساختیافته و شیگرا رو هم میتونیم به نوعی شیگرا بدونیم)شی گرایی فرایندی هست که شما در طول مراحل مختلف توسعه نرم افزار، مثل تحلیل، طراحی، و کدنویسی با آن درگیر هستید. از نظر کدنویسی، کدی شی گرا هست که در آن اصول اولیه شی گرایی؛ یعنی استفاده صحیح از کلاس ها و اشیاء برای کپسوله سازی، مجرد سازی (Abstraction)، وراثت، و چند ریختی (Polymorphism)، رعایت شده باشه.
ساختیافتگی منافاتی با شی گرایی نداره، بلکه شی گرایی به نوعی بسط دهنده مفاهیم مرتبط با Structural Programming هست.
چطور دید شیگرا پیدا کنیم.گفتم، شی گرایی و توسعه نرم افزار به شیوه شی گرا یک فرآیند هست، و صرفا به کد نویسی مربوط نمیشه. شما وقتی میخواید یک نرم افزار به شیوه شی گرا بنویسید، از همون مرحله آنالیز، مسائل را در قالب اشیائی که در برنامه با آنها سر و کار دارید، و ارتباطات این اشیاء با هم آنالیز می کنید. در مرحله طراحی هم همین اشیاء و ارتباطات شان را مدل می کنید، و در مرحله کد نویسی هم همین اشیاء را پیاده سازی می کنید.
شیگرایی واقعا چقدر متفاوته با برنامهنویسی تابعی؟منظورتون از برنامه نویسی تابعی چی هست؟ Procedural Programming یا Functional Programming؟ این دو عبارت مفاهیم مختلفی هستند.
شما بايستي تو زمينه Design Pattern مطالعه كنيد تا اصول و قواعد حاكم رو ياد بگيريد شايد بعضي از مفاهيم در هنگامي يادگيري OO رو به ذهن داشته باشيد در Design Pattern به چرايي همه اين مسايل پرداخته ميشه.موافق نیستم، چون؛ اساسا Design Patternها برای توضیح چرایی مسائل، یا آشنایی با قواعد و اصول شی گرایی ایجاد نشدند. Design Patternها در واقع بهترین راهکار حل مسئله از نظر ایجاد کنندگان آنها برای یک سری از مسائل متداول هستند. یعنی یک سری از مسائلی که در طراحی نرم افزار معمولا برنامه نویسان با آن مواجه میشند و به دنبال راه حل برای آنها هستند، شناسایی شدند؛ و بهترین راهکار برای حل اون مسائل از دیدگاه اون افراد، به صورت الگوهایی مطرح شد.
در Design Pattern به شما گفته میشه، فرض کنیم شما در توسعه نرم افزارتان با فلان مشکل یا فلان شرایط خاص مواجه شدید، به نظر ما، برای رفع این مشکل، بهترین راهکار طراحی نرم افزاتان به فلان شکل هست. برای این منظور هم توضیحاتی درباره مشکل، و توضیحاتی درباره راهکار پیشنهادی ارائه میشه.
فایده Design Patternها در این هست که اولا شما در برخورد با مشکلات و شرایط متداول در توسعه نرم افزار، نیاز ندارید که خودتان با سعی و خطا بهترین راهکار را پیدا کنید، بلکه یک گروه از توسعه دهندگان با تجربه و آگاه، با تکیه بر تجربیات و دانش خودشان بهترین راهکار را به شما ارائه کردند. ثانیا، از آنجایی که این الگوها، الگوهای شناخته شده ایی در بین توسعه دهندگان نرم افزار هستند، سایر برنامه نویسان به محض اینکه متوجه بشند که شما از فلان الگوی خاص در این بخش از برنامه تان استفاده کردید، با توجه به شناختی که از آن الگو دارند، درک بهتری از برنامه شما پیدا می کنند، و راحتر متوجه طراحی شما و پیاده سازی آن می شوند.
soft-c
پنج شنبه 28 مرداد 1389, 22:48 عصر
سلام
من یک سوال دارم؟
آن سوال این است که به یک برنامه ی دلفی با این همه کارایی یک برنامه ی شی گرا گفته می شود و به یک برنامه ی جاوا هم ( البته به جز ورژن application آن ) یک برنامه ی شی گرا گفته می شود . پس تفاوت این دو برنامه در چیه ؟
در صورتی که هر دو از کلاس استفاده می کنند ولی در جاوا وقتی شما می خواهید یک شی را بسازید باید کلاس آن را بسازید ولی در دلفی به راحتی این کار امکان پذیز است .
(هر چند در دلفی هم می شود با کلاس نویسی و بدون درگ کردن شی یک شی ایجاد کرد و ورژن های application جاوا هم وجود دارد)
حمیدرضاصادقیان
پنج شنبه 28 مرداد 1389, 23:29 عصر
سلام .دوست عزیز شی گرایی یک نوع شیوه برنامه نویسی هست. در همین دلفی هم شما میتونید به صورت ساختیافته برنامه بنویسید.مهم این نیست قابلیتهای برنامه چقدر باشه مهم اینه که طبق اصول نوشته شده باشه.
جاوا ذاتا زبانی شی گرا هست. الزامی نیست بین یک برنامه شی گرا با برنامه دیگه تفاوت داشته باشه.
بیشتر تفاوتشون در توسعه اون نرم افزارها، رفع ایرادها، مدیریت سورس ، تعداد خطوط سورس هست.
که معمولا در برنامه های غیر شی گرا مشکلات توسعه،رفع ایراد ، حجم کد زیاد خودشونو نشون میدن.چون کدهای تکراری زیادی موجود هست.نمونه برنامه هاش هم من خودم دیدم برنامه ای که میشه کلا با 10 هزار خط به صورت خیلی قشنگ نوشتش(شایدم کمتر) الان نزدیک 90 هزار خط داره با کلی ایراد که هرجای برنامه رو دست میزنی 100 جای دیگه بهم میخوره.
موفق باشید
مصطفی ساتکی
شنبه 30 مرداد 1389, 09:40 صبح
موافق نیستم، چون؛ اساسا Design Patternها برای توضیح چرایی مسائل، یا آشنایی با قواعد و اصول شی گرایی ایجاد نشدند. Design Patternها در واقع بهترین راهکار حل مسئله از نظر ایجاد کنندگان آنها برای یک سری از مسائل متداول هستند. یعنی یک سری از مسائلی که در طراحی نرم افزار معمولا برنامه نویسان با آن مواجه میشند و به دنبال راه حل برای آنها هستند، شناسایی شدند؛ و بهترین راهکار برای حل اون مسائل از دیدگاه اون افراد، به صورت الگوهایی مطرح شد.
در Design Pattern به شما گفته میشه، فرض کنیم شما در توسعه نرم افزارتان با فلان مشکل یا فلان شرایط خاص مواجه شدید، به نظر ما، برای رفع این مشکل، بهترین راهکار طراحی نرم افزاتان به فلان شکل هست. برای این منظور هم توضیحاتی درباره مشکل، و توضیحاتی درباره راهکار پیشنهادی ارائه میشه.OO يك استاندار تعريف شده اي كه متشكل از يك سري اصوليه كه طراح ملزم به رعايت اونا در صورت رعايت نكردن اين اصول در آينده طراحي با مشكلات مختلفي روبرو ميشه.
Design Pattern در مراجع مختلف ديده گاههاي مختلفي داره ولي به طور مشترك به يك سري اصول كلي اشاره مي كنند.يكي از مواردي كه شما فرموديد استفاده از الگوهاي آماده است.
شما به فرض رو OO مسلط باشيد ولي در طراحي تكنيك هاي Memory Allocation رو در نظر نگيريد و خط مشي نداشته باشيد در Performance پروژه تاثير منفي ميزاريد .
يا در استفاده از Template تجربه كافي نداشته باشيد پروژه در طولاني مدت با مشكل مواجه ميشه چون در اون صورت طراحي ناپايداري خواهيد داشت كه هر لحظه احتمال refactoring كردن ميره اگر بخواهيد feature هاي جديدي رو اعمال كنيد.
اينكه ضرورت Prototyping رو درك كنيد و پياده سازي اون بعدها چه تاثيراتي در طراحي پروژه داره و چطور prototype كنيد كه هم شماي كلي پروژتون مشخص بشه و هم اينقدر جامع باشه كه دوباره كاري محسوب نشه.
يادگيري اصول و چگونگي بكارگيري MultiThread و MultiDesign در پروژه به طوري كه اين پياده سازي تاثير مثبت داشته باشه.
نكات كه در طراحي بايستي براي compileTime و DesignTime در نظر بگيريم هستند افرادي كه اصلاً به نكات توجه نمي كن .
چگونگي و استفاده صحيح از UML و استفاده درست و به اندازه از دياگرام هاي مختلف بسته به ابعاد پروژه نه صرفاً وقت تلف كردن و نمودارهاي زايد
چگونگي بكارگيري interface و استفاده از رويه هاي Static و دهها مطلب ديگه كه بايستي يه طراح علاوه بر OO اينها رو هم آموزش ببينه.
البته خيلي از اين مطالب ذكر شده به كامپايلر هم بر مي گرده مثلاً دلفي در زمينه Template ها به شدت ضعيف عمل كرده و در نسخه هاي جديد از اونها پشتيباني كرده كه بيتشر روي Container تاكيد داره تا Template به هر حال شايد در نسخه هاي بعدي حرف هايي براي گفتن داشته باشه
vcldeveloper
شنبه 30 مرداد 1389, 19:26 عصر
OO يك استاندار تعريف شده اي كه متشكل از يك سري اصوليه كه طراح ملزم به رعايت اونا در صورت رعايت نكردن اين اصول در آينده طراحي با مشكلات مختلفي روبرو ميشه.
Design Pattern در مراجع مختلف ديده گاههاي مختلفي داره ولي به طور مشترك به يك سري اصول كلي اشاره مي كنند.يكي از مواردي كه شما فرموديد استفاده از الگوهاي آماده است.
شما به فرض رو OO مسلط باشيد ولي در طراحي تكنيك هاي Memory Allocation رو در نظر نگيريد و خط مشي نداشته باشيد در Performance پروژه تاثير منفي ميزاريد .
مفهوم Pattern مشخص هست. مواردی هم که ذکر کردید، باز به همون کاربردی که برای Design Patterns ذکر کردم، برمیگرده؛ یعنی ارائه راه حل مناسب برای یک مسئله خاص. حالا ممکنه شما فقط از همون چند pattern معروف مدنظر Gangs of four بهره ببرید، یا در بسیاری از امور دیگه از patternهای دیگه ایی هم استفاده کنید. کارکرد Pattern به همون شکل هست، فقط مسائل فرق می کنند.
اینکه من گفتم موافق نیستم، یعنی Design Patterns به خودی خود ربطی به شی گرایی و مفاهیم آن ندارند. کمک خاصی هم به درک اون مفاهیم نمی کنند. بلکه با تکیه بر همون اصول و مفاهیم اولیه شی گرایی سعی می کنند برای مسائل رایج راهکارهای مناسب ارائه کنند. این به معنی اون نیست که آشنایی با Design Patterns فایده نداشته باشه! بلکه خیلی در توسعه نرم افزار خیلی هم مفید هستند، اما اینجا بحث شی گرایی هست، و اصول و مفاهیم آن. Design Patterns های رایج خودشان از این اصول و مفاهیم بهره می برند، و نمیشه به آنها برای فهم همان اصول و مفاهیم اولیه تکیه کرد.
البته خيلي از اين مطالب ذكر شده به كامپايلر هم بر مي گرده مثلاً دلفي در زمينه Template ها به شدت ضعيف عمل كرده و در نسخه هاي جديد از اونها پشتيباني كرده كه بيتشر روي Container تاكيد داره تا Template به هر حال شايد در نسخه هاي بعدي حرف هايي براي گفتن داشته باشه
فکر کنم تنها زبان برنامه نویسی رایجی که اون مفهوم Templateها را داشته باشه، ++C هست. اون چیزی که در سایر زبان ها مثل جاوا یا #C (و از جمله در دلفی از نسخه 2009 به بعد) وجود داره، Generics هست. در ++C این Generics وجود نداره، و به جاش Templateها رایج هستند، ولی Templateها عینا مترادف با Generics نیستند، بلکه در کاربرد شباهت زیادی با Generics دارند. البته این بخش از بحث دیگه به موضوع تاپیک ارتباط پیدا نمیکنه.
developing
دوشنبه 01 شهریور 1389, 16:42 عصر
با سلام.
از اینکه لطف کردید و این مطالب رو نوشتید ممنونم.
یه توضیح بدم
من الان برنامه رو که میبینم میتونم بگم کدوم بخش از اون رو میشه به تابع تبدیل کرد که کد هم خواناتر بشه و هم کمحجمتر علاوه بر اون میتونم بگم که مثلا با نوشتن این قطعه کد توی یک تابع استفاده از حافظه کمتر یا زیادتر میشه.
ولی در مورد کلاسها اصلا تبحر ندارم و وقتی میخوام یک کد رو بصورت کلاسی و شیگرا بنویسم دقیقا نمیتونم تشخیص بدم که الان چند تا کلاس باید بنویسم، چه کلاسی به صورت پایه برای کلاس دیگه باید ایجاد بشه، چطور وراثتها رو بهینه کنم و سوالهایی که برای شما معمول هست.
حالا شما دارید در مورد مباحث فوق پیشرفتهی شیگرایی بحث میکنید من هنوز نمیدونم Design Pattern چیه.
ممنون میشم تجربیات خودتون در مورد شروع برنامهنویسی شیگرا یا آموزشهایی مقدماتی رو اینجا بگید که من هم بتونم به وسیلهی اونها به سمت برنامهنویسی شیگرا و تبحر توی این زمینه قدم بردارم.
اگه سطح بحثهاتون رو هم یه کم پایینتر بیارین ممنون میشم.
با تشکر فراوان
vcldeveloper
دوشنبه 01 شهریور 1389, 17:20 عصر
ولی در مورد کلاسها اصلا تبحر ندارم و وقتی میخوام یک کد رو بصورت کلاسی و شیگرا بنویسم دقیقا نمیتونم تشخیص بدم که الان چند تا کلاس باید بنویسم، چه کلاسی به صورت پایه برای کلاس دیگه باید ایجاد بشه، چطور وراثتها رو بهینه کنم و سوالهایی که برای شما معمول هست.
اگر شما تعریف صحیحی از کلاس و شی در ذهن تون داشته باشید، و خودتون رو عادت بدید که به صورت شی گرا درباره برنامه فکر کنید، این چیزها رو راحت پیدا می کنید. البته برای اینکه همچین تعریف و نگرش صحیحی داشته باشید، باید درباره شی گرایی مطالعه کنید. کتاب های زیادی در این رابطه وجود دارند. لزومی نداره یک کتاب دلفی در این زمینه مطالعه کنید. اصول شی گرایی ثابت هستند و وابسته به یک زبان برنامه نویسی خاص نیستند.
به طور کلی، هر کلاس شامل داده های مرتبط با هم، و کارهایی هست که میشه روی اون داده ها انجام داد (متدهای اون کلاس). تفکر شی گرا چیز سختی نیست، چون منطبق بر دید عادی ما نسبت به دنیای پیرامون مان هست؛ مثلا شما یک شی، مثل گوشی موبایل را می بینید، و به راحتی می تونید اجزاء تشکیل دهنده آن، و کارهایی که این گوشی انجام میده را برای خودتان لیست کنید، مثلا بگید این گوشی صفحه کلید داره، میکروفن داره، آنتن داره، صفحه نمایش داره، و غیره، و از طریق آنتنش با یک آنتن BTS ارتباط برقرار میکنه، به این صورت شماره میگیره، و غیره. همچنین بعضی از متعلقاتش مستقیما در اختیار کاربر هستند (مثل صفحه کلید یا صفحه نمایش) و بعضی از متعلقاتش هم برای کارکردش لازم هستند ولی در اختیار کاربر نیستند (مثلا ICهای استفاده شده در آن). عملکردهاش هم همینطور، شما که با گوشی تماس می گیرید، عمل تماس شما یک عمل هست، ولی ممکنه گوشی برای اون تماس، ده ها عمل مختلف را در پشت صحنه، بدون اینکه شما متوجه بشید، انجام بده. از اینجا مفهوم Visibility یا Access modifiers مطرح میشه، یعنی هر داده یا هر عملکردی باید در چه سطحی در اختیار سایر کلاس ها قرار بگیره.
حالا اگر شما کلاس های مورد نیاز در برنامه تون رو بشناسید و اون ها را تعریف کنید، می تونید ارتباطات بین این کلاس ها را هم مشخص کنید. وقتی این کار را انجام دادید، در برنامه تان از این کلاس ها اشیائی می سازید که بر اساس تعریفی که در کلاس شان انجام دادید، با هم تعامل برقرار می کنند. مثلا در مثال گوشی موبایل، شما یک شی از موبایل و یک شی کلاس انسان ایجاد می کنید، و این اشیاء با هم تعامل برقرار می کنند، مثلا انسان از طریق صفحه کلید موبایل شماره ایی میگیره، موبایل با شماره مربوطه تماس میگیره، و صدای طرف مقابل را به گوش انسان میرسونه، و انسان از طریق میکروفن گوشی با طرف مقابلش صحبت می کنه.
ممنون میشم تجربیات خودتون در مورد شروع برنامهنویسی شیگرا یا آموزشهایی مقدماتی رو اینجا بگید که من هم بتونم به وسیلهی اونها به سمت برنامهنویسی شیگرا و تبحر توی این زمینه قدم بردارم.
برای اینجور مقولات کلی، انتظار چندانی از یک انجمن نداشته باشید. برای این مسائل باید مطالعه کنید. کتاب های مختلفی درباره تحلیل شی گرا، طراحی شی گرا، و یا برنامه نویسی شی گرا وجود دارند. باید اینها را مطالعه کنید، تا یک دید کلی پیدا کنید. اون وقت می تونید در یک انجمن، درباره یک موضوع خاص در این زمینه سوال بپرسید و جواب بگیرید.
BORHAN TEC
دوشنبه 01 شهریور 1389, 18:05 عصر
آن سوال این است که به یک برنامه ی دلفی با این همه کارایی یک برنامه ی شی گرا گفته می شود و به یک برنامه ی جاوا هم ( البته به جز ورژن application آن ) یک برنامه ی شی گرا گفته می شود . پس تفاوت این دو برنامه در چیه ؟
در صورتی که هر دو از کلاس استفاده می کنند ولی در جاوا وقتی شما می خواهید یک شی را بسازید باید کلاس آن را بسازید ولی در دلفی به راحتی این کار امکان پذیز است .
(هر چند در دلفی هم می شود با کلاس نویسی و بدون درگ کردن شی یک شی ایجاد کرد و ورژن های application جاوا هم وجود دارد)
به برنامه ای شی گرا گفته می شود که در آن از مفاهیمی مانند کلاس و غیره استفاده شود. یک برنامه می تواند ترکیبی هم باشد مثلاً بخشی از آن به صورت شی گرا و بخش دیگر به صورت ساخت یافته پیاده سازی شود.(البته همه زبانهای برنامه نویسی اجازه این کار را نمی دهند). کامپوننت را می توان یک قالبی در نظر گرفت که کلاسی را در خودش جای می دهد که با درگ کردن آن به روی یک فرم یک شی از آن کلاس مربوط به آن ایجاد می شود. پس اگر در محیط برنامه نویسی از کامپوننت استفاده نشده باشد نمی توان گفت فلان زبان شی گرا نیست. به عنوان یک توضیح بهتر می توانم بگویم تمام کامپوننت ها کلاس هستند اما تمام کلاس ها کامپوننت نیستند.
developing
سه شنبه 02 شهریور 1389, 15:59 عصر
با سلام
ضمن اینکه تشکر دوباره دارم از همتون.
من اصلا نگفتم شیگرایی در چه زبانی وجود داره و یا در چه زبانی وجود نداره این هم که اینجا بحث رو باز کردم فقط به خاطر اینه که من خودم رو برنامهنویس دلفی میدونم(این علاقهی من هست وگرنه من به زبانهای C++, C# هم برنامهنویسی میکنم ضمنا C++ رو تدریس هم میکنم.) در ضمن فکر نمیکنم مجربتر و متبحرتر از علی آقا توی این سایت وجود داشته باشه و ایشون هم که برنامهنویس دلفی هست و بیشتر توی تالارهای دلفی مطلب مینویسن و میشه گیرشون آورد.
میشه منابعی رو معرفی کنید که بتونم با مطالعهی اونها شیگرایی رو بهتر درک کنم. اگه منابع هم لاتین باشند و هم فارسی ممنون میشم. چون من انگلیسیم ضعیفه و اگه یک کتاب لاتین رو بخوام مطالعه کنم یک ماهی طول میکشه.
منابع هر چی بود کتاب ، pdf ، فیلم آموزشی ، سایت و ...
با تشکر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.