# فناوری جاوا > برنامه‌نویسی جاوا > بحث و گفتگو در مورد فناوری های مرتبط با جاوا > گفتگو: شی گرایی در جاوا : مزایا , معایب , توصیه ها و خطرات.

## mazdadoost

*با سلام: در این تاپیک میخوایم درباره سر فصل های زیر به گفتگو و تبادل نظر بپردازیم:*

مزیت هایی که برای یک برنامه نویس جاوا ازامکانات شی گرایی جاوا وجود دارد.معایب مدل شی گرای جاوا(این معایب حتی می تواند به شکل مقایسه ای با سایر زبان های برنامه نویسی شی گرا باشد.توصیه هایی که یک برنامه نویس جاوا میتواند برای استفاده صحیح از امکانات شی گرایی جاوا به سایر برنامه نویسان جاوا داشته باشد .خطرات احتمالی استفاده ناصحیح در شی گرایی در جاوا (به عبارتی نقاط بحرانی در توسعه برنامه ها در جاوا که استفاده ناصحیح از شی گرایی در جاوا میتوتند باعث شکست در توسعه نگهداری و بروز رسانی محصول نرم افزاری شود)
امیدوارم دوستان با شرکت در این گفتگو علاوه بر به اشتراک گذاری تجربیات نظرات و ایده های خود در پربار کردن معلومات دوستان جاوا کار سهیم شوند.
با تشکر.

----------


## cups_of_java

من با قسمت 1و2 در این بحث موافقم چون در سطح زبان برنامه نویسی و محدود تر هستند.

برای موارد 3 و 4 کتاب ها می شه نوشت! خیلی بحث رو شلوغ می کنه و ضمنن از جاوا می تونه بیرون مطرح شه. برای این دو مورد آخر که بیشتر به تکنیک های طراحی شی گرا بر می گرده بزارید تو یک بحث دیگه برسیم.

----------


## mazdadoost

باشه . فعلا روی دو آیتم اول صحبت میکنیم.

----------


## cups_of_java

از نکات قوت طراحی جاوا در برنامه نویسی شی گرا:
1. زبانیست صرفن شی گرا! همه چیز داخل کلاس ها هستند! موجود global معنی ندارد!

2.  ساختار سلسله مراتب تک ریشه ای دارد. کلاس Object پدر همه کلاس هاست! این مورد مزیت های زیادی هم برای برنامه نویس هم برای کامپایلر (قوت typing) دارد.

3. مفهوم Interface رو به عنوان کلاسی که صرفن معرف تعدادی عملیات است نه بدنه اون ها استفاده می کند.

4. عدم پشتیبانی از وراثت چند گانه از کلاس ها (به علت مشکل مدل دایموند) و پشتیبانی از وراثت چند گانه از Interfaceها

5. تعریف همه متد ها به طور پیش فرض به صورت virtual! برنامه نویس مشکل تعریف کردن یا نکردن صریح virtual متد ها رو ندارد. چون در شی گرایی اصولن متد غیر virtual استفاده نمی شه!

الان دیگه چیزی به ذهنم نمی رسه!

کسانی هستند که این لیست رو بزرگتر کنند؟ 
یا هستند کسانی که ایراداتی به مدل شی گرای جاوا رو ذکر کنند؟

----------


## mazdadoost

دوست عزیز :
الان نمیخوام ایرادی رو مطرح کنم فقط چند نکته :
1-در جاوا انواع اولیه داریم int-byte-booleanووو. یعنی به شکل مخض محض مثل زبانهایی مثل Ruby و Groovy همه چیز شی نیست .البته مقایسه در سطح دستوری. حتی جای مطالعه کردم که جاوا رو یک زبان میان سطح طبقه بندی کردن.
2-اگه میشه مورد 2تا 5 رو بسط بدین.
3-خودم دارم رو یه لیست خلاصه از مفاهیم شی گرایی و روش پیاده سازیشون در جاوا تهیه میکنم و تا اون موقع اگر زحمتی نیست شما این مواردی که گفتین رو بیشتر توضیح بده.
مرسی.

----------


## cups_of_java

> 1-در جاوا انواع اولیه داریم int-byte-booleanووو. یعنی به شکل مخض محض مثل زبانهایی مثل Ruby و Groovy همه چیز شی نیست .البته مقایسه در سطح دستوری. حتی جای مطالعه کردم که جاوا رو یک زبان میان سطح طبقه بندی کردن.


داشتن انواع داده ای اولیه موضوعیه که در زبان ها به طور سنتی بوده! جاوا هم همین طور و خللی هم به شی گرایی وارد نمی کنه. مقالات زیادی این موضوع رو بررسی کرده بودند ولی برای راحتی کار برنامه نویس جاوا از نسخه 5 نوع های اولیه رو با اشیای متناظرشون یکپارچه کرد. (مکانیزم autoboxing) که در اون مثلن یک int با شی ای از کلاس Integer فرقی نداره. 
میان سطح یعنی چی؟ اون جا لینکش کو؟ بدین تا بشه بررسی کرد چی گفته!؟





> 2-اگه میشه مورد 2تا 5 رو بسط بدین.


 هر کدومش یک صفحه مطلب می تونه باشه. 
بپرسید سوال هاتون رو به شکل سوال و جواب عمل کنیم بهتره.

----------


## mazdadoost

ببینید من نگفتم خللی در شی گرایی ایجاد میکنه .گفتم جاوا کاملا و محض شی گرا نیست به این جهت که داده اولیه داره. و از خود سازندگانش هم بپرسید بهتون میگن این هارو از سی به ارث برده چرا ؟ چون شما اینطور لازم نیست برای کار با یک عدد به اندازه یک شی کامل فضا مصرف کنید . یا به اندازه یک شی کامل موقع پاک کردنش از حافظه به GC فشار بیارید چون اصلا GC کاری به این انواع اولیه نداره!این بخاطره اینه که جاوا میتونست خیلی جلوتر از امثال Ruby کاملا شی گرا باشه در حد زبان نه API که شما فرمودین . منتها جاوا یک زبان و یک پلتفرم گستردست که از یک چیپ که اینترپرتر جاوا رو به شکل سخت افزاری مستقیما اجرا میکنه تا سوپر کامپیوتری که کلی منابع سخت افزاری داره باید پابه پای زبان محلی پذیرفته شده سیستم ها یعنی C و CPP کار کنه .نتیجه : طراحان جاوا و کاربرانش مجبورند از این انواع داده اولیه استفاده کنند . و این نه تنها ضعفی نیست بلکه نشون میده طراحی خوب یک زبان و یک پلت فرم اینطور نیست که شما همه چیز  یک تئوری و مفهوم رو در عمل پیاده کنید .همین رهیافت رو CPP دنبال میکنه منتها در CPP علاوه بر انواع اولیه متنوع(که وابسته به پلت فرم هستن بر خلاف جاوا ) یعنی داده ها رفتار هم شکلی شی گرا میتونه نداشته باشه یعنی Global Function . این یعنی اینکه این زبان چون اصول یک محیط شی گرا رو زیر پا گذاشته پس زبانی هست کاندید کنارگذاشتن ؟ خیر این زبان یبان اول برنامه نویسان دنیاست و خود جاوا رو هم باش نوشتن .

در مورد Autoboxing and Unboxing  یه ویژگی کامپایل تایمه و هنوز هم داستان تبدیل Warper ها در بایت کد وجود داره (و آورهد ناشی از اون موقه رانتایم!که مهم نیست!) یعنی :



> Integer i = 0;


میشه :
Integer i = new Integer(0); 


اصلا چرا باید به جای :



> int a=20;


بنویسم :

int foo = 0;

	Integer integer = a;

	

	// Simple Unboxing

	int a = integer;


که مسئله مهمی نیست.




> میان سطح یعنی چی؟ اون جا لینکش کو؟ بدین تا بشه بررسی کرد چی گفته!؟


C++‎: TheCompleteReference ThirdEdition
HerbertSchildt



> هر کدومش یک صفحه مطلب می تونه باشه. 
> بپرسید سوال هاتون رو به شکل سوال و جواب عمل کنیم بهتره.


سوالی ندارم فقط خواستم توضیح بیشتری بدین تا دنباله مطالب رو ادامه بدیم.

----------


## cups_of_java

1. بله JAVA مثل Ruby، Smalltalk و... شی گرای محض (pure object otiented ) نیست. اما همونطور که شما گفتید علت وجود انواع داده ای اولیه primitive به خاطر مسائلی مثل performance و compatibility با C++‎ و ... هست. همون طور که می دونید این مسئله چیزی نیست که خللی به شی گرایی وارد کنه. مهم عدم وجود globalها (همه چیز در کلاس ها هستند)، عدم وجود operator overloading (می تونه شی گرایی رو زیر سوال ببره)، عدم وجود delegateها (این رو هم مخالف اصول شی گرایی می دونند) و type-checking قوی و... هست که جاوا رو یک زبان شی گرای خوب معرفی می کنه. این طوری بخوایم بررسی کنیم موجود enum که در جاوا 5 اضافه شد هم خلاف شی گرایی هستش (ولی این طور نیست) جاوا که به علت شی گرا نبودن enum اون ها رو از اول نداشت!  مجبور شد به خاطر رقابت با دنیای برنامه نویس ها (مخصوصن سی شارپ) enum رو اضافه کنه و اون ها رو به صورتی شی گرا پیاده سازی کرد. اما هرگز delegate رو اضافه نکرد چون اعتقاد داشتن این دیگه خیلی خلاف شی گرایی هستش. (و واقعن هم همین طوره)

ببینید به نظر من به طور کلی چیزی مخالف شی گرایی هست که یکی از اصول شی گرایی رو زیر سوال ببره. درسته که ما بین primitiveها وراثت و چند ریختی نداریم اما این خیلی حالت خاصی هست چون در دنیای واقع هم شما عدد خام داری و عدد یک شی نیست! ولی معدل داری! و معدل می تونه شی باشه با داده و رفتار هایی که روش تعریف می شه کرد.



2. در مورد middle level بودن جاوا که کلمه ایست که فکر کنم خود Herbert Shildt از خودش دراورده باید بگم C همون طور که داره می گه تو اون منبع و دلایلش هم کاملن درسته زبانیه که سطح بالاست ولی خیلی به زبان های سیستمی و سطح پایین نزدیکه پس گفته بزاریمش تو رده میانی ها. اما اگه همون دلایلی که C رو تو این رده قرار می ده برای جاوا بررسی کنیم جاوا در این رده قرار نمی گیره!
جاوا اجازه استفاده از کد ماشین رو نمی ده
جاوا اجازه کار با اشاره گر ها رو نمی ده
جاوا strongly typed هست
...
پس ایشون اشتباه می کنه (در شکل فقط این رو آورده و در متن چیزی ازش نگفته) و جاوا سطح بالا هست.

----------


## MIDOSE

می گم بحث را چقدر زود تموم کردید دیگه خبری نیست؟؟؟ راستی دوستان شما از کدوم منبع تونستید روی مباحث شی گرای تسلط نسبی پیدا کنید (کتاب خاصی وجود داره یا نه؟

----------


## mazdadoost

2-اگر جای شما بودم کمی محتاط تر درباره شخصیتی مثل Herbert Shildt اظهار نظر میکردم. خود من هم وقتی اولین بار این مطلب رو خوندم تا حدی مخالفتم رو برانگیخت.منتها ا نگاهی دقیق تر متوجه شدم اگر این مسئله چند سال پیش مطرح میشد , بله حق با سطح بالا بودن جاوا بود .اما امروز با پیشرفت نظریه های جدید در حوزه برنامه نویسی و حل مسائل با کامپیوتر ملاک های جدیدتری برای تعین سطح یک زبان به وجود اومده . و بعضی مرز ها کلا به وضوح قبل نیست! 
به این مطلب نگاهی بندازید :
http://www.codecommit.com/blog/java/...evel-languages
1-قبل از مطرح کردن ادامه مطلب از دوستان میخوام به یک مقدمه کوتاه دقت کنند:
هر زبان برنامه نویسی صرف نظر از نوعش و رهیافتی که در مدیریت کد ها داره برای یک کاربرد اصلی خلق شده : *پیاده سازی حل مسائل با کامپیوتر*

چنانچه با این مطلب موافق باشید و اون رو به عنوان اصل راهنما در ادامه این بحث بپذیرید  .تا الان که من دارم این مطلب رو ارائه میدم  با توجه به سخت افزار کنونی رایج یعنی معماری کنونی کامپیوتر ها هنوز یک روش مشترک توسط CPU ها برای انجام عملیات کامپیوتری وجود داره و اون هم :*اجرای ترتیب توالی دستوراتی هست که هر سازنده در محصول خودش لحاظ کرده*.

شاید پردازنده های چند هسته ای و سیستم ها چند ریسمانی شده باشند اما این هم مسئله رو تغیر نمیده.به عبارتی حجم و سرعت اجرای توالی دستورات بالا رفته و همونطور که گفتم یک کامپیوتر هنوز که هنوزه یک برنامه رو به شکل توالی مشخصی از دستورات ماشین درک میکنه .

برگردیم به سمت دیگر ماجرا یعنی زبان برنامه نویسی . روشنه که هر رهیافتی در پیاده سازی برنامه های کامپیوتری از قبیل روال گرا - ساخت یافته  -شی گرا -تابعی و ... در نهایت به همین توالی های قابل درک برای سخت افزار کامپیوتر ختم میشه .چی میخوام بگم ؟

میدنیم که یکی از مبانی برنامه نویسی شی گرا :*مدلسازی دنیای واقعی در کامپیوتر*  هست .(البته منظورم این نیست که این یعنی شی گرایی !) . برای این منظور دنیا رو به شکل موجودیت های به نام شی در نظر میگیریم مثلا یک  دفتر تلفن !به طور کلی شامل دو طرف جلد - چند برگه سفید - احتمالا چند ایندکس برای مرتب کردن بر اساس نام . (این از یه دیده!میتونیم به شکل عناصر تشکیل دهندش (شی مورد نظر در شیمی) یا کنش ها و واکنش هاش با محیط اطرافش (شی مورد نظر در فیزیک) در نظر بگیریمش!)
برای مدل سازی این شی واقعی در کامپیوتر میتونیم تمام این قسمت ها رو به شکل اشیایی تعریف کنیم و رفتار (متد) و خصوصیات (خواص) مختلفشون رو در کلاس های مربوط به خودشون کپسوله در نهایت برای برقراری رابطه بینشون از پیام ها استفاده کنیم! اما جای پیام ها در دنیای خارج برای دفترچه تلفن چیه؟ آیا واقعا وفتی ما در دفترچه تلفن بین صفحات از طریق ایندکس ها دنبال یک نام خواص میگردیم و در صفحه مورد نظر لیست نام ها رو دنبال میکنیم همون رفتاری رو پیش میگیریم که در برناممون با اشیاء متدها خواص و آلگوریتم هایی که مختص کامپیوتر هستنند پیش گرفتیم!به بیان دیگر آیا موجودیت اشیائ در دنیای واقعی و ربطشون در ساخت دنیا همون موجودیتی هست که در شی گرایی کامپیوتری سراغ داریم .به شکل خلاصه :
*محیطی که اشیاء درش موجودیت میابند قواعد وجودی اشیاء رو مشخص میکنه*  (صرف نظر از اینکه این سخن چقدر فلسفی باشه) در کامپیوتر هر چقدر هم شما زبانی داشته باشید که درش اصول شی گرایی رعایت شده باشه باز هم اشیاء موجودیتی کامپیوتری دارند .برای مثال :بازی شطرنج رو در نظر بگیرید .میخواید گری کاسپاروف رو شبیه سازی کنید (منظورم یک بازیکن خبره است!) صرف نظر از اینکه از چه آلگوریتمی استفاده میکنید و این آلگوریتم روی چه سخت افزاری پیاده میشه(PC- یا سوپر کامپیوتر) شی بازیکن شما اگر شانس بیاره و فقط یک شی باشه (چیزی که در دنیای واقع هست فقط گری کاسپاروف هست ولی شما ممکنه اون رو در اشیاء آلگوریتم - اشیایی برای مدیریت داده های آلگوریتم ها - اشیایی برای انجام آلگوریتم ها به شکل موازی و ووو تکه تکه کنید و از طریق پیام هابه هم وصلشون کنید!) باید تبدیل به توالی مشخصی از کد ها برای سخت افزار تبدیل بشه .در این بین شما یا محیط برنامه نویستون کاسپاروف رو در دو مرحله پیاده سازی میکنید اول روال هایی که برای کامپیوتر قابل درک تره و دوم کپسوله کردن این روال ها برای ساخت اشیایی که برای انسان قابل فهمتره. در این بین درمرحله ای که از چیز هایی که برای کامپیوتر قابل فهمتره پیش میرید این حق شماست که : بر کامپیوتر فرمانروایی کنید! از هر نوع ساختار داده ای استفاده کنید و هر کاری که فکر میکنید برای افزایش سرعت - مقاومت در مقابل شرایط بسیار بحرانی - حد اکثر قابلیت اطمینان و غیره لازمه انجام بدین .در این شاید بد نباشه از ترکیب delegate و یا Function Pointer ها برای رسیدن به نهایت سرعت و کارایی استفاده کنید یا توابع رو آورلود کنید (هرچند که این به نظرم با شی گرایی مخالف نیست فقط قابلیت خوندن برنامرو برای سایر برنامه نویسان سخت تر میکنه ! در دنیای واقعی من میگم یک سیب به علاوه یک سیب چه اشکالی داره بنویسم Apple+Apple‍!)(هر چند که جاوا این ها رو به شکل ضمنی داره! منتها در سطح شی گرا ! و عملگر + رو برای رشته ها آورلود کرده!) . وقتی شاکله قابل فهم برای کامپیتر رو ریختین میتونید پیچیدگی ها و جزئیات رو در اشیاء بسته بندی کنید! اشیاء و شی گرایی هم از اینجا به بعد در ایجاد سه مزیت وجودی خودشون شکل میگیند :
1- ایجاد یک چهارچوب شفاف از ماجول های برنامه . که منتهی به امکان استفاده از رابطها برای انسان ها رو جهت بهره گیری از پیچیدگی های داخلی ماجول بدون نیاز به درگیری با این پیچیدگی ها میده(چه پیچیدگی هایی که از پیچیدگی خود موضوع هست چه پیچیدگی هایی که طبق فرمایش شما از استفاده از ویژگیهای خلاف شی گرایی زبان به خاطر همون موضوعی که گفتم( الزامات افزایش درک برنامه برای کامپیوتر ) به برنامه خواه ناخواه تحمیل میشه).
2-ایجاد چهارچوبی برای ساخت کتابخانه هایی که به خاطر مواردی مثل وراثت باز هم برای توسعه بیشتر توسط انسانها به سادگی و با خطای کمتری نسبت به روش های غیر شی گرا امکان پذیره.
3-امکان استفاده مجدد از کد ها با کمترین دردسر.
به این ترتیب میخوام بگم شما در زبانی که میتونید برنامه های خوب رو به خوبی بنویسید که هم خوب و کارا برای کامپیوتر باشه هم برای انسان ! پس به ناچار باید با هر دو نگاه به برنامه نوسی نگاه کنید منتها در باره جاوا یک در کنار سایر اصول زبان های شی گرا وجود داره که باعث میشه خیلی از شاخو برگ های زبانی مثل C++‎ رو نداشته باشه و اون اینه :سادگی(برای انسان ها!).
هر چند که با اومدن چیزی مثل Generics ها این مسئله رو میتونید با خوندن کتابخانه هایی که با Gnerics نوشته شدن بفهمید که جاوا دیگه نمیتونه روی این اصل سادگی برای انسان پافشاری کنه و امروز دیگه برای برنامه نویسان تازهکاری که به سمت جاوا میان حتی امکانات دستور زبانی جاوا مثل Generics-Inner claass-و قواعد حاکم بر اونها میتونه یک چالش برای یادگیری باشه. به مرور احتمالا با اومدن Clussur ها در جاوا 7 این چالش بیشتر هم میشه (برخورد با کد به شکل شی که میتونه کلی از کارهایی رو که با Function Pointer ها , 
delegate ها در زبان های دیگه ممکنه عملی کنه).


امیدوارم مفید بوده باشه .در پست بعدیم میخوام از اصول شی گرایی و نحوه پیادسازیشون در جاوا صحبت کنم.

----------


## cups_of_java

> 2-اگر جای شما بودم کمی محتاط تر درباره شخصیتی مثل Herbert Shildt اظهار نظر میکردم. خود من هم وقتی اولین بار این مطلب رو خوندم تا حدی مخالفتم رو برانگیخت.منتها ا نگاهی دقیق تر متوجه شدم اگر این مسئله چند سال پیش مطرح میشد , بله حق با سطح بالا بودن جاوا بود .اما امروز با پیشرفت نظریه های جدید در حوزه برنامه نویسی و حل مسائل با کامپیوتر ملاک های جدیدتری برای تعین سطح یک زبان به وجود اومده . و بعضی مرز ها کلا به وضوح قبل نیست! 
> به این مطلب نگاهی بندازید :
> http://www.codecommit.com/blog/java/...evel-languages


اگه اشتباه نکنم کتاب ایشون مال سال ۲۰۰۰ هست! و منطق ایشون در کتابش جالب و توجیه کننده نیست خیلی! ایشون شخصیت معتبری هستند اما افراد بزرگتر و با تجربه تری در زمینه زبان های برنامه نویسی هستند. بین آدم هایی که من می شناسم ایشون خیلی برام گنده نیست!
مقاله ای که برای ۲۰۰۸ هست و لینکش رو دادید خیلی بهتر (چون به روز تره) مسله زبان های برنامه نویسی رو مطرح کرده و قابل قبول هست دیدش (هرچند جای بحث داره ولی خوب موضوع این تاپیک در ارتباط با این چیزا نیست)





> 1-قبل از مطرح کردن ادامه مطلب از دوستان میخوام به یک مقدمه کوتاه دقت کنند:


متنتون رو خوندم و چند مورد توصیه دارم در مورد نوشتنتون:
۱. به عنوان مقدمه حجمش زیاده! (این جا یک فروم (انجمن اینترنتی) هست. ما اینجا کتاب نمی خوایم بنویسیم!)
۲. جملاتتون خیلی طولانیه. در متون علمی و فنی باید از جملات ساده و کوتاه (قابل فهم) استفاده کنید.
۳. مطلب گسستگی داره! همگون نیست! از اول از بحث زبان برنامه نویسی شروع کردین بعد رسیدین به سخت افزار و پردازنده و (ترتیب اجرای سریال و همروندی و ..) بعد سراغ شی گرایی رفتید (از شی در دنیای واقع حرف زدید و ...) بعد از ساختار های زبانی (delegate و closure,...) و generics و overloadingو ...و ...

خلاصه با خوندن متن شما من هدف متن رو درک نکردم. حرف ها درست! خب؟ بعدش چی؟  باید تراوشات ذهنتون رو مرتب کنید و بر اساس موضوع دسته بندی کنید (قبلن هم گفتم که دیدتون رو باید روی یک موضوع متمرکز کنید) تا بشه از حرف ها نتیجه گرفت! انتقال دانش کرد! انتقال ایده کرد! و ...
این موضوع رو من در مطالعه مقاله ای که برای جلد اول مجله نوشته بودید هم در متون شما دیدم اما به علت نبود وقت بهش اشاره نکردم.

ضمنن روی اون حرفتون که گفتید هم مثل دنیای واقع فکر می کنیم هم مثل کامپیوتر من حرف دارم. قضیه اینقدر هم بغرنج نیست.

در نهایت من احساس نمی کنم هدف ما اینجا بررسی شی گرایی از دیدگاه  (و به هدف) پیاده سازی یک زبان برنامه نویسی باشه. ما اینجا می خوایم اصول شی گرایی و نحوه کاربرد صحیح اون ها رو یاد بگیریم!

----------


## cups_of_java

> می گم بحث را چقدر زود تموم کردید دیگه خبری نیست؟؟؟ راستی دوستان شما از کدوم منبع تونستید روی مباحث شی گرای تسلط نسبی پیدا کنید (کتاب خاصی وجود داره یا نه؟


این سوال ربطی به بحث این تاپیک نداره. امیدوارم از تاپیک جدامون نکنه ولی این چند نکته در زمینه سوالتون:

اگه برنامه نویس خوبی باشید (با مفاهیم پایه برنامه نویسی آشنا باشید و برنامه زیاد نوشته باشید) یادگیری اصول  شی گرایی در برنامه نویسی چند ماهی بیشتر وقتی ازتون نمی گیره. کتاب های اقای  Bruce Eckel در این زمنینه معرکه هستند. توصیه می کنم حتمن یکی از کتاب هاشو (بسته به زبانی که بلدید)  رو بخونید. 
Thinking In Java
Thinking in C++‎
Thinking in Python

کتاب Implementation Patterns اقای Beck
...
بعد باید اصول شی گرایی رو بیشتر مطالعه کنید. بحث های اقای Robert Martin در مقاله هاش توی اینترنت یا در کتابی مثل Applying UML and Patterns از آقای Craig Larman دید خوبی بهتون می ده. 

بعد به طور موازی شروع کنید به یاد گیری الگو های شی گرایی در طراحی برنامه که کتاب فوق العاده (یکی از شاهکارهای خلق شده در دانش مهندسی نرم افزار) Design Patterns: Elements of reusable software از GangOfFour رو بخونید. کتاب های اقای Buschman معروف به POSA هم خوب هستند.  نهایتن و کمکم با دید سطح بالای شی گرایی وکاربردش در تحلیل و طراحی نرم افزار (سطح بالا تر از برنامه نویسی) آشنا شید و کاربردش در مهندسی نرم افزار شی گرا! برای این منظور باید کتاب هایی در زمینه متدولوژی های نرم افزاری مثل این لیست رو بخونید!
کتاب تحلیل و طراحی اقای Booch (ده ها کتاب خوب در این زمینه هستند)
کتاب های آقای Martin Fowler (برای آشنایی با Refactoring و ...)
کتاب های اقای Scott Ambler و
...


خلاصه برای رسیدن به دید باز و مسلط شدن باید یکی دو سالی مطالعه کنید و کار کنید تا در عمل کاربرد این مطالب رو حس کنید. در مورد هر کتاب یا زمینه اگه اطلاعات خواستید بپرسید تا در اختیارتون قرار بدم) وقت نداشتم همه کتاب ها رو با اطلاعات دقیقشون جمع کنم و اینجا بنویسم.

----------


## mazdadoost

> اگه اشتباه نکنم کتاب ایشون مال سال ۲۰۰۰ هست! و منطق ایشون در کتابش جالب و توجیه کننده نیست خیلی! ایشون شخصیت معتبری هستند اما افراد بزرگتر و با تجربه تری در زمینه زبان های برنامه نویسی هستند. بین آدم هایی که من می شناسم ایشون خیلی برام گنده نیست!


راستش من این آقا رو هم درست نمیشناسم! فقط تو همون کتابی که ذکر کردم نوشته که کتابهاش بالاترین میزان فروش رو در زمینه آموزشیش دارند. که CPP و C هست.
در مورد توصیه هاتون ممنون . 



> ۱. به عنوان مقدمه حجمش زیاده! (این جا یک فروم (انجمن اینترنتی) هست. ما اینجا کتاب نمی خوایم بنویسیم!)
> ۲. جملاتتون خیلی طولانیه. در متون علمی و فنی باید از جملات ساده و کوتاه (قابل فهم) استفاده کنید.
> ۳. مطلب گسستگی داره! همگون نیست! از اول از بحث زبان برنامه نویسی شروع کردین بعد رسیدین به سخت افزار و پردازنده و (ترتیب اجرای سریال و همروندی و ..) بعد سراغ شی گرایی رفتید (از شی در دنیای واقع حرف زدید و ...) بعد از ساختار های زبانی (delegate و closure,...) و generics و overloadingو ...و ...


اره خودمم سختم بود طولانیه . اما برای روشن شدن معیار هام برای مزیت و عیب شی گرایی در جاوا برای دیگرانی که تو این بحث همراهیم میکنن لازم بود . شاید در ادامه جلوی خیلی از بدفهمی ها رو بگیره.
در مورد طولانی بودن جملات راستش طور دیگه بلد نیستم !  :چشمک:  گسستگی هم دقیقا برمیگرده به اینکه این فقط یک پست تو یک تاپیک تو فاروم برنامه نویسه . و دقیقا توی همین گسستگی های به نظر شما نامرتبطه که انتظار دارم فهمیده شم چون خیلی از مطالبش رو دقیقا چون ایجا یک فارومه و این یک پست قیچی کردم! اخخخخ در مورد اون مقاله که نگو دلم خونه (اتفاقا من همون موقع که اولین بار نوشتمش با سردبیر درمورد شیوه نوشتنم صحبت کردم گفت خوبه منهتا گفت کمه!بیشترش کن من هم کردم ووو خلاصه اش شله غلم کاری شد که هنوزم تکلیفش معلوم نیست! بگذریم...).
من از سایر دوستان هم میخوام که وارد گود شن که هم به معلومات ما افزوده بشه هم مروری بر دانش خودشون باشه.
مرسی.

----------


## farzad2121

دوستان یه چیز که خیلی ها باید بدونند اینه که در جاوا انواع داده ای کلاس محسوب می شوند و کد های جاوا ویروسی نمی شن چون برخلاف زبان سی وسی پلاس پلاس خبری از اشاره گر ها نیست تا به هر جای حافظه سرک بکشی.امنیت کد جاوا در نظر داشته باشین دوستان.

----------


## javaphantom

> دوستان یه چیز که خیلی ها باید بدونند اینه که در جاوا انواع داده ای کلاس محسوب می شوند و کد های جاوا ویروسی نمی شن چون برخلاف زبان سی وسی پلاس پلاس خبری از اشاره گر ها نیست تا به هر جای حافظه سرک بکشی.امنیت کد جاوا در نظر داشته باشین دوستان.


با شما موافقم. به نکته خیلی جالبی اشاره کردید. من خودم مدتی بود که متوجه این مسئله شده بودم و دلیل اصلیشو نمی دونستم. من همیشه می دونستم که اشاره گره ها خیلی بی خودند ولی نمی دونستم که انقدر خطرناک هستند. چه خوب شد که جاوا بلدم  :گیج:

----------

