PDA

View Full Version : مشکل با مفهوم شی گرایی



karimi.ali
پنج شنبه 17 دی 1388, 21:41 عصر
دوستان ببینین درست متوجه شدم؟

system.console.writeline()توی این کد، system کتابخانه هست، console کلاسی در system هست، writeline() متدی در کلاس console هست. درست متوجه شدم؟
آقا من وحشتناک با این چیزای C#‎ مشکل دارم. یکی یه راهنمایی بکنه...

gh-reza
پنج شنبه 17 دی 1388, 21:54 عصر
روابط سه قسمت مورد نظر شما رو با شبه کد زیر نشون میدم


namespace system
{
public class Console
{
public <output> WriteLine(<inputs>)
{
codes...
}
}
}

jeson_park
جمعه 18 دی 1388, 01:23 صبح
سلام دوست عزیز
system فضای نام هست(که برای تداخل پیدا نکردن 2 کلاس هم نام استفاده میشه)
کنسول هم کلاس هست و writeline() هم متد
پیشنهاد می کنم msdn رو هم در کنار ویژوال استودیو نصب کنید
حالا سوال بعدی تون رو بگید

mir555
جمعه 18 دی 1388, 09:28 صبح
فضا نام مثل یک درایو می مونه کلاس مثل یک شاخه می مونه و متد مثل یک فایل البته فقط از لحاظ زیر مجموعه بودن اینو میگم

اَرژنگ
جمعه 18 دی 1388, 09:46 صبح
فضا نام مثل یک درایو می مونه کلاس مثل یک شاخه می مونه و متد مثل یک فایل البته فقط از لحاظ زیر مجموعه بودن اینو میگم
این تمثیل خوبی نیست چونکه :
۱.فضا میتوند بر چند اسمبلی تقسیم شده باشد
۲.کلاس میتواند در چبد فایل مختلف به شکل پارشیال تقسیم شده باشد
۳.متد میتونند در چند تا اُورلد تقسیم قده باشد.

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

Mahdi.Kiani
جمعه 18 دی 1388, 13:19 عصر
سلام
پست های فاقد محتوای این تاپیک خذف گردیدند. لطفا از جرو بحث های بی مورد خودداری فرمائید و این موارد را در صورت نیاز از طریق پیام خصوصی مطرح کنید.
موفق باشید

karimi.ali
جمعه 18 دی 1388, 14:18 عصر
چیزی که این وسط موند، سر در گمی من تازه کار هست. من با مفاهیم اولیه سی شارپ و در کل شی گرایی مشکل دارم. یه راهنمایی و یا منبع quick بدین برم. خواهشا کتاب هاشمیان را معرفی نکنین.

shahriar2211
جمعه 18 دی 1388, 14:22 عصر
چیزی که این وسط موند، سر در گمی من تازه کار هست. من با مفاهیم اولیه سی شارپ و در کل شی گرایی مشکل دارم. یه راهنمایی و یا منبع quick بدین برم. خواهشا کتاب هاشمیان را معرفی نکنین.

بهتره یک کتاب در مورد شی گرایی و uml تهیه کنید و مطالعه بفرمایید . در کتاب فروشی های معتبر از این جور کتابها زیاد پیدا میشه .
مانند :


طراحی شی گرای سیستمهای نرم افزاری با UML


کتاب آموزشی UML 2.0: به انضمام تمرین جامع و گام به گام برای نشان دادن چگونگی به کارگیری UML در پروژه های واقعی

gh-reza
جمعه 18 دی 1388, 19:20 عصر
این تمثیل خوبی نیست چونکه :
۱.فضا میتوند بر چند اسمبلی تقسیم شده باشد
۲.کلاس میتواند در چبد فایل مختلف به شکل پارشیال تقسیم شده باشد
۳.متد میتونند در چند تا اُورلد تقسیم قده باشد.

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

ینجا یه سوال خیلی ساده درباره اجزای شیءگرائی C#‎ پرسیده شده و سوال کننده و سوال کننده در درجه اول میخاد مفهوم اجزای جدا شده بوسیله نقطه رو متوجه بشه. پس قیاس namespace با درایو چندان هم اشتباه نیست. هرچند فولدرها رو هم بهتره قیاسی برای namespace در نظر بگیریم. همون طور که توی جاوا Packageها، که تقریبا معادل namespace هستن، عملا با فولدرهای تو در تو پیاده میشن. و سلسله مراتب روابط کلاسها رو مشخص میکنن. از namespace جهت طبقه بندی کلاسها برای طراحی یک نرم افزار خوب ساخته میشه. علاوه بر خوش تعریفی پروژه و تقسیم کار راحتتر در گروه های سازنده، میتونه باعث افزایش امنیت هم بشه. چون کلاسها یا متدها میتونن برای اعضای یک namespace قابل فراخوانی باشن و برای اعضای سایر namespaceها این طور نباشن (البته این به نظر سازندگان ربط داره). یک پروژه میتونه اصلا شامل namespace آشکار (explicit) نباشده. مزیت دیگر فضای نام همونطور که از اسمش هم پیداست افزایش انعطاف پذیری در نامگذاری کلاسها هست. چراکه گاهی لازمه یک پروژه بزرگ توسط گروه ها و یا شرکتهای مختلفی توسعه داده بشن و در این صورت ممکنه کلاسهایی با نام یکسان توسط شرکتها استفاده بشه. در این صورت فضای نام میتونه کارگشا باشه و هر شرکت میتونه مثلا کلاسهای خودشو توی فضای نام هم نام با شرکت قرار بده و با این ترتیب هیچ مشکلی در پروژه پیش نیاد. چون هر نام فقط در فضای نام خودش معتبر و دسترسی به کلاسهای یک فضای نام تنها با ذکر نام فضای نام به همراه نقطه میانی امکان پذیره. یا میتونیم در ابتدای برنامه توسط using فضای نامی رو اعلان کنیم تا دیگه هر بار از کلاسهای اون استفاده میکنیم مجبور به ذکر فضای نامها نباشیم.

در عوض هر پروژه در C#‎ باید حداقل شامل یک کلاس باشه که نقطه ورود به برنامه (تابع Main) درونش قرار بگیره. تعریف کردن متد و متغیر در خارج از کلاس هم غیر ممکنه. اعضای یک namespace میتونن کلاسهای همکار باشن (همکار از این جهت که به یه شرکت یا شخص خاص تعلق دارن یا از نظر عملکرد در یک سمت و سو هستن). اعضای کلاس متدهایی هستن که روی متغیرهای کلاس عمل میکنن، یعنی کلاس متشکل از متغیرها و متدهای مرتبط با متغیرهاست. در تفکر برنامه نویسی سنتی برنامه ها و الگوریتمها اهمیت داشتن ولی در تفکر شیءگرائی، داده ها اهمیت دارن. هر شیء یک ابر داده هست که شامل داده های اولیه، ابر داده های دیگر، و نحوه برخورد با داده ها میشه. یعنی داده ها و عملیات ممکن روی داده ها کپسوله میشن و کسی نمیتونه روی داده ها تغییرات غیر مجاز اعمال کنه چرا که نحوه عمل کردن روی داده ها از طریق واسطی که شیء تدارک دیده انجام میشه.به این ترتیب میتونیم مجوزهای دسترسی برای داده ها و متدهای عضو برای کلاسهای مختلف تعیین کرده و برنامه نویسی امنتری انجام داد.شعار تفکر شیء گرائی اینه که "هرکی باید به قدری بدونه که لازمه" یعنی یجور طبقه بندی اطلاعاتی انجام میگیره. مثلا موتور خودرو رو در نظر بگیرین. راننده نیازی نیست که بدون توی موتور چه خبره، فقط کافیه بهش بگید وقتی گاز میده ماشین حرکت میکنه. اینکه راننده نیازی نیست چیزی درباره موتور بدونه علاوه بر سهولت و تسریع یادگیری رانندگی، امنیت بیشتر رو هم بدنبال داره. چون راننده چیزی درباره نحوه کار با موتور نمیدونه که کنجکاویشو تحریک کنه و باعث خرابی ناخواسته بشه. یا اینکه سازنده بدنه اتوموبیل نیازی به آشنائی با نحوه ساخت و عملکرد پیستون نداره و ...
اینائی که گفتیم مربوط به اولین مزیت شیءگرائی، یعنی کپسوله سازی (Encapsulation) میشه.
مزیت بعدی در باره امکان چندریختی میشه (Polymorphism) یعنی به کدهایی با عملکرد مشابه ولی روی داده های متفاوت نام های یکسانی داده میشه. مثلا اگر عمل جستجو در میان یکسری داده مد نظر باشه، میتونیم عمل جستجو رو روی مولفه های مختلف با یک نام برای تابع تعریف کنیم. یعنی اسم همه متدها Search باشه و فقط داده های ورودیشون فرق کنه بجای اینکه بگیم SearchInt و SearchFloat و...
مزیت بعدی مربوط به استفاده مجدد از کدها و اصلاح و ارتقای کدهای موجود در کلاس از طریق ارث بری (Inheritance) و مفاهیمی مثل Overriding میشه.به این ترتیب میشه کدی یک دست و قابل ارتقا در آینده درست کرد. همچنین از ارثبری میتونیم برای تعریف کلاسهای جدید با امکانات کلاس قبلی استفاده کنیم، و این یعنی استفاده مجدد از کد و کلی صرفه جوئی در وقت و انرژی.

متدها (مانند Console) عمل خاصی که مد نظر ماست انجام میدن و یه متد لزوما باید درون یک کلاس تعریف بشه. متد میتونه برای کار روی متغیرهای نمونه همون کلاس استفاده بشه (هدف اصلی هم همینه) و میتونه یک سرویس عمومی باشه برای هر متغیر ورودی (از طریق پارامتر) مانند تابع Sin کلاس Math. یک متد میتونه پویا (dynamic) یا ایستا (static) باشه. از هر متد یا متغیر ایستا به ازای کلاس یک نمونه وجود داره و این بین همه اشیا از همون کلاس مشترکه. نحوه دستیابی به این نوع متغیرها و توابع از طریق نام کلاس و نقطه میانی تعریف شده (مانند Math.Sin(...) و یا Console.WriteLine(...)). در برابر از متغیرها و متدهای پویا به ازای هر شیء یک نمونه وجود داره و نحوه دسترسی به اونها از طریق نام شیء هست.
تفاوت شیء و کلاس: کلاس مثل یک نقشه ساختمون هست و میشه گفت؛ فقط یک نمونه از اون وجود داره، فقط یک طرح بوده وجود خارجی و عینی نداره و یک مفهوم انتزاعی هست. مثلا نمیشه به اتاق پذایرائی یک نقشه ساختمان وارد شد یا از پله هاش بالا یا پائین رفت. در عوض هر شیء نمونه عینی و تحقق یافته کلاس مربوط به خودش هست، از یک کلاس نمونه های زیادی میشه شاخت که در عین تشابه یکی نیستن، مثلا اتاق طبقه اول مشابه طبقه دوم هست ولی مجزا هستن. ولی مثلا مولفه تعداد طبقات مربوط به نقشه هست نه ساختمان.


namespace test
{
namespace test1
{
public class class1
{
public static int x;
public static void func1()
{
// some codes...
}
public int y;
public void func2()
{
// some codes...
}
}

public class class2
{
public static int x;
public static void func1()
{
// some codes...
}
public int y;
public void func2()
{
// some codes...
}
}
}

namespace test2
{
public class class1
{
public static void func1()
{
// some codes...
}

public static void func2()
{
// some codes...
}
}

public class class1
{
public static void func1()
{
// some codes...
}

public static void func2()
{
// some codes...
}
}

public class class3
{
public static void Main(string [] args)
{
// use static variable of class1 of test1
Console.WriteLine(test1.class1.x);
// use static method of class1 of test1
test1.class1.func1();
// define an object of type class1 of test1
test1.class1 t1c1 = new test1.class1();
// use dynamic variable of class1 of test1
Console.WriteLine(t1c1.y);
// use dynamic method of class1 of test1
t1c1.func2();

// use static variable of class2 of test1
Console.WriteLine(test1.class2.x);
// use static method of class2 of test1
test1.class2.func1();
// define an object of type class2 of test1
test1.class2 t1c2 = new test1.class2();
// use dynamic variable of class2 of test1
Console.WriteLine(t1c2.y);
// use dynamic method of class2 of test1
t1c2.func2();

// use static variable of class1 of test2
Console.WriteLine(test2.class1.x);
// use static method of class1 of test2
test2.class1.func1();
// define an object of type class1 of test2
test2.class1 t2c1 = new test2.class1();
// use dynamic variable of class1 of test2
Console.WriteLine(t2c1.y);
// use dynamic method of class1 of test2
t2c1.func2();

/*
I don't use test2 namespace name before class
class2, because class3 and class2 placed in
same namespace (test2)
I also could to not use the test2 prefix before
class1 of test2 namespace.
*/
// use static variable of class2 of test2
Console.WriteLine(class2.x);
// use static method of class2 of test2
class2.func1();
// define an object of type class2 of test2
class2 t2c2 = new class2();
// use dynamic variable of class2 of test2
Console.WriteLine(t2c2.y);
// use dynamic method of class2 of test2
t2c2.func2();
}
}
}
}

به خاطر غلطهای املائی و انشائی معذرت میخام. یه خورده عجله داشتم.
موفق باشید.