PDA

View Full Version : عدم امنیت در سطح دسترسی اعضای private ؟!؟



alireza_tavakol
چهارشنبه 28 مرداد 1388, 14:34 عصر
با سلام خدمت اساتید و دوستان محترم

من تا چند ساعت پیش فکر می کردم :اشتباه:: اعضای کلاس ها که با سطح دسترسی private تعریف می شوند فقط و فقط در بدنه کلاس قابل دسترس هستند و به این شکل امکان دسترسی غیر مجاز ( دسترسی مستقیم ) رو از برنامه نویس های سطح پایین تر سلب می کردم.

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

http://www.barnamenevis.org/forum/showpost.php?p=403657&postcount=13

http://www.barnamenevis.org/forum/showpost.php?p=406029&postcount=17

مخصوصا" جمله آخر از پست دوم که آقای PC2st.ir نوشتن

alireza_tavakol
سه شنبه 03 شهریور 1388, 03:58 صبح
:اشتباه:با تشکر از دوستانی که تا اینجا در بحث مشارکت کرده اند:لبخند:

مثل اینکه اصلا" نتوانستم مسئله رو به خوبی تشریح کنم واسه همین یک مثال می زنم شاید به روشن شدن سوال کمک کنه

فرض بفرمایید من دو تا فرم دارم و هر دو تا فرم در حالت Show قرار دارند

اگه من روی فرم Form1 دکمه ای داشته باشم با اسم Button1 و Modifiers این دکمه در حالت Private قرار داشته باشه

با دستور زیر می توانم اندازه این دکمه رو توسط فرم Form2 تغییر دهم
Application.OpenForms["Form1"].Controls["Button1"].Width = 100;

به نظر شما سطح دسترسی Private چه نقشی داشته؟:متفکر:

SMRAH1
سه شنبه 03 شهریور 1388, 04:06 صبح
سلام

دوست من،این دو تا دارای دو تا دسترسی متفاوت اند.مثلا در کد زیر :

class C
{
//...
}
class D
{
private C myVar;
public C MyProp {
get
{
return myVar;
}
set
{
myVar = value;
}
}
}
با اینکه myVar قابل دستزسی از بیرون نیست،توسط MyProp می توان اون رو تغییر داد.

موفق باشید

اَرژنگ
سه شنبه 03 شهریور 1388, 08:10 صبح
با سلام خدمت اساتید و دوستان محترم

من تا چند ساعت پیش فکر می کردم :اشتباه:: اعضای کلاس ها که با سطح دسترسی private تعریف می شوند فقط و فقط در بدنه کلاس قابل دسترس هستند و به این شکل امکان دسترسی غیر مجاز ( دسترسی مستقیم ) رو از برنامه نویس های سطح پایین تر سلب می کردم.

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

http://www.barnamenevis.org/forum/showpost.php?p=403657&postcount=13

http://www.barnamenevis.org/forum/showpost.php?p=406029&postcount=17

مخصوصا" جمله آخر از پست دوم که آقای PC2st.ir نوشتن

استفاده از پرایوت برایه امنیت از لحاض دسترسی امنیتی نیست، برایه طبقه بندی کد برایه خودتان است.
فکر کنید که اگر همه چی یک کلاس پابلیک بود اینکه چی برایه استفاده است و چی فقط برایه استفاده خود کلاس است ممکن نمیشد.
حتی در غیره دات‌نت همیشه میتوان به کد و اعضایه پرنامه دست انداخت، ولی اون یک چیزه دیگری است.

keivan mousavi
سه شنبه 03 شهریور 1388, 14:08 عصر
من اول یک توضیحی درباره کلاسها بدم


Public : این کلاس باعث میشه که تمامی کلاسها با اون المنتی که شما تعریف کردید دسترسی داشته باشن و آنرا call کنن


Private : دسترسی به اون المنت رو فقط درون کلاس ممکن میکنه


Protected : شباهت زیادی به private داره یعنی سطح دسترسی به فیلد/متد و... باعث میشه علاوه بر اینکه در محدوده اون کلاس قابل رویت هست در sub calss های اون کلاس هم دیده بشه

Internal : این کلاس برای فیلدهای داخل اسمبلی در دسترس خواهد بود ولی خارج از اون اسمبلی اون کلاس دیگه دیده نمیشه

Protected Internal : این کلاس هم در سطح اسمبلی قابل رویت هست و هر کلاسی که به اون کلاس درایو بشه میتونه دسترسی داشته باشه

شما سطح دسترسی private رو برای کلاسی تعیین کردی که داره کلاس دیگه ای رو call میکنه خوب این ایرادش کجاست؟؟؟

alireza_tavakol
سه شنبه 03 شهریور 1388, 15:06 عصر
سلام

دوست من،این دو تا دارای دو تا دسترسی متفاوت اند.مثلا در کد زیر :



class D
{
private C myVar;
public C MyProp {
get { return myVar; }
set { myVar = value; }
}
}
با اینکه myVar قابل دستزسی از بیرون نیست،توسط MyProp می توان اون رو تغییر داد.

موفق باشید

سلام

دوست عزیز ،منم از این خبر دارم که میشه توسط بدنه هر کلاس به اعضای Private همان کلاس دسترسی داشت.

اصلا" فلسفه وجودی property های public چیست ؟ (جواب) چون برنامه نویس های استفاده کننده از کلاسهای نوشته شده توسط دیگری توانایی دسترسی به فیلد های private را ندارند نویسنده کلاس property های public رو تعریف میکنه تا امکان دسترسی دیگران به صورت کنترول شده به مقادیر private حاصل شود.

شما توی مثالی که زدی توسط یک property یک فیلد private رو در دسترس قرار دادی .

اما مثالی که من زدم این بوده که یک دکمه با modifier که private بود توسط کلاس Application در معرض دسترسی مسقیم قرار گرفته .(این درحالی است که کلاس Application هیچ ربطی به کلاس Form1 ندارد یعنی جز اعضای بدنه کلاس Form1 نیست که توانایی دسترسی به اعضای خصوصی این کلاس رو داشته باشه)

Application.OpenForms["Form1"].Controls["Button1"].Width = 100;

alireza_tavakol
سه شنبه 03 شهریور 1388, 15:19 عصر
اعضایی که Private تعریف شده باشند تنها درون خود کلاس قابل استفاده هستند. متدهای private را بعضی اوقات helper method یا utility method نیز می نامند ، چون جهت کمک برای سایر متد ها نوشته می شوند.پس اگر لزمی به استفاده از اعضا کلاس در بیرون آن نیست آنها را Private تعریف نمایید.




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




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




نقطه مقابل Private ، Public است که از دستیابی به یک عضو از خارج از کلاس جلوگیری می کند.




موجب میشود این متد قفط توسط توابع و یا متد های دیگر داخل همان بخش استفاده شود.
/صفحه 234/ برنامه نویسان دیگر ، نمی توانند از عضو private استفاده نماییند.



استفاده از پرایوت برایه امنیت از لحاض دسترسی امنیتی نیست، برایه طبقه بندی کد برایه خودتان است.
فکر کنید که اگر همه چی یک کلاس پابلیک بود اینکه چی برایه استفاده است و چی فقط برایه استفاده خود کلاس است ممکن نمیشد.
حتی در غیره دات‌نت همیشه میتوان به کد و اعضایه پرنامه دست انداخت، ولی اون یک چیزه دیگری است.

همان طوری که می بینید توی این کتاب ها اون تعریف خاصی که شما از کلمه private کرده اید را نگفته اند . کما اینکه اگر فرض رو بر این بگذاریم که :
اگر همه چی یک کلاس پابلیک بود اینکه چی برایه استفاده است و چی فقط برایه استفاده خود کلاس است ممکن نمیشد.
خب ما می توانستیم با attribute هایی همچون
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]

به نتیجه ای که شما می خواستید می رسیدیم

alireza_tavakol
سه شنبه 03 شهریور 1388, 16:12 عصر
با سلام مجدد

یکی از تعابیری که به مفهوم encapsulation مربوط می شود ، مخفی سازی در پیاده سازی است.(یعنی کسی که داره از شی اتومبیل استفاده میکنه از سیستم سوخت رسانی خبر نداره و امکان دسترسی مستقیم به دریچه کاربراتور رو نداره چون دریچه کاربراتور private تعریف شده ولی کسی که داره از شی اتومبیل استفاده میکنه از پدال گاز خبر داره چون public تعریف شده ، این در حالی است که پدال گاز از سیستم سوخت رسانی خبر داره و حتی به دریچه کاربراتوری که private تعریف شده دسترسی داره چون در بدنه کلاس اتومبیل است )

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

من روی جوابی که شما دادن خیلی فکر کردم ولی تنوانستم خودم رو قانع کنم چون


استفاده از پرایوت برایه امنیت از لحاض دسترسی امنیتی نیست، برایه طبقه بندی کد برایه خودتان است.
فکر کنید که اگر همه چی یک کلاس پابلیک بود اینکه چی برایه استفاده است و چی فقط برایه استفاده خود کلاس است ممکن نمیشد.
حتی در غیره دات‌نت همیشه میتوان به کد و اعضایه پرنامه دست انداخت، ولی اون یک چیزه دیگری است.

حالا اگه قرار باشه این تعریف شما رو بپذیریم پس ابزار مخفی سازی چیست؟

و این دقیقا" سوالی بوده که من توی این تاپیک مطرح کردم

یعنی اگه ما به این نتیجه برسیم که private توانایی مخفی سازی 100 درصد رو نداشته باشه پس مفهوم مخفی سازی که جز لاینفک کپسوله سازی است نقض میشه پس عملا" یکی از اصول سه گاه ( وراثت - چند ریختی - کپسوله سازی )معماری شی گرا از بین میره!

با تشکر از دوستان پاسخ دهند/

alireza_tavakol
سه شنبه 03 شهریور 1388, 17:56 عصر
من اول یک توضیحی درباره کلاسها بدم


Protected Internal : این کلاس هم در سطح اسمبلی قابل رویت هست و هر کلاسی که به اون کلاس درایو بشه میتونه دسترسی داشته باشه


با اینکه این سوال ربطی به این تاپیک نداره ولی میشه بفرمایید این نوع سطح دسترسی دقیقا در کجا عنوان میشه چون من نتونستم از این سطح دسترسی استفاده کنم و حتی توجیهی واسه وجود این سطح دسترسی پیدا نکردم:متفکر:

SMRAH1
سه شنبه 03 شهریور 1388, 21:57 عصر
سلام

چند سئوال به شکل موازي (و با مفاهيم نزديک به هم مطرح است).
1) آيا مي توان يک متغير Private و يک خصوصيت مرتبط به آن با دسترسي Public داشت؟ جواب : بله و نمونه آن در پست 3 آمده است.
2) اصلا دسترسي Private براي چيست؟ جواب : هدف محدود کردن دسترسي است.حالا چرا؟ در پست هاي مختلف، زواياي متفاوت مطرح شده است.يکي مديريت دسترسي است،يکي امنيت (به مفهوم پايداري شي) است.ديگري عدم دسترسي به عناصر غير مجاز از خارج (براي سردرگم نشدن استفاده کننده) و ... توجه کنيد که همه اينها در منابع آموزشي به وضوح مطرح نمي شوند و گاها حتي مطرح نمي شوند!
3) دوباره به مثال زير توجه کنيد:

class C
{
private int myVar;
public int MyProp
{
get
{
return myVar;
}
set
{
myVar = value;
}
}
}

class D
{
public int myVar;
}
اين دو کلاس داراي پياده سازي شبيه هم اند.در واقع کاملا مثل هم عمل مي کنند (به عبارت ديگر MyProp در کلاس C حذف شده و دسترسي عمومي به myVar داده شده است).حالا سئوالي مطرح مي شود.کدام يک درست است و يا کدام يک بهتر است؟ جواب : قطعا پياده سازي کلاس C ! براي چرايي اين موضوع دو سناريو رو در نظر بگيريد (شبيه اين دلايل هنوز هم مي توان بافت که فقط دوتاي آن را مطرح مي کنم) :
الف) فرض کنيد بعد از پياده سازي و استفاده از کلاس هاي بالا (يکي از اين کلاس ها) متوجه مي شويد که متغير myVar نمي تواند مقدار 100 بگيرد! اگر پياده سازي D را استفاده کرده باشيد بايد تمام جاهايي که D.myVar استفاده شده است را جستجو و شرط عدم وجود مقدار 100 را اضافه کنيد.اين يعني زير رو رو کردن برنامه!!!! اما اگر از پياده سازي C استفاده کنيد،کافيست کد زير را تغيير دهيد :

class C
{
private int myVar;
public int MyProp
{
get
{
return myVar;
}
set
{
if(value == 100)
throw new Exception(...);
myVar = value;
}
}
}
ب) اگر بخواهيد کنترلي روي مقدار ورودي انجام شود مثلا اگر مقدار myVar در محدوده خاصي است و يا اصلا زماني که مقدار myVar تغيير ميکند شي، «محاسباتي» را دوباره انجام دهد.پس داريم :

class C
{
private int myVar;
public int MyProp
{
get
{
return myVar;
}
set
{
//Do any thing
myVar = value;
}
}
}
4) شما فرموديه بوديد که با اوصاف «کپسوله سازي» زير سوال مي رود؟ اينجا يک سئوال مطرح مي شود.آيا مي توان در زبانهاي شي گرا ،کلاسي ايجاد کرد که تمام خصوصيات،فيلدها و متد هاي آن عمومي باشد؟ جواب معلوم است (بله).پس اين مخالف شي گرا يي نيست.اما اشتباه از اين جا سر چشمه مي گيرد که شما اينها را «اصول» ناميديد ،اما من بهتر مي دانم که کلمه «مفاهيم» استفاده کنم.چون پس از درک اين مفاهيم ،هر کدام از ما برنامه نويسان،به شکلي آنها را پياده سازي مي کنيم (در کليات ثابت ايم ولي در جزئيات پياده سازي ممکن است متفاوت باشيم).البته هر چه تجربه بالاتر رود،قطعا اين مفاهيم را بهتر درک کرده و بهتر پياده سازي مي کنيم (اميدوار توانسته باشم مفهورم را برسانم).

موفق باشيد

alireza_tavakol
چهارشنبه 04 شهریور 1388, 01:59 صبح
با سلام

من فکر کنم دوستان پاسخ دهند ، سوال منو اصلا" متوجه نشدن

سوال من اصلا" هیچ ربطی به property و یا encapsulation ندارد

سوال من درباره نحوه دسترسی به اعضای private است وقتی هیچ property برای دسترسی به اون ها تعریف نشده

من دارم فاش میگم ، چرا این امکان وجود داره که می توان از یک کلاس کاملا" مستقل ، به اعضای خصوصی ( private ) یک کلاس دیگه به شکل مستقیم دسترسی پیدا کرد؟ ( به این نکته توجه کنید اصلا" property برای دسترسی به عضو خصوصی تعریف نشده )

کلام خودم رو توی دو تا لیکنی که تو پست اول و قطعه کدی که توی پست دوم گذاشتم اثبات کردم

حالا دنبال ادله منطقی برای توجیه این سوال هستم!

اَرژنگ
چهارشنبه 04 شهریور 1388, 02:57 صبح
من دارم فاش میگم ، چرا این امکان وجود داره که می توان از یک کلاس کاملا" مستقل ، به اعضای خصوصی ( private ) یک کلاس دیگه به شکل مستقیم دسترسی پیدا کرد؟ ( به این نکته توجه کنید اصلا" property برای دسترسی به عضو خصوصی تعریف نشده )

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

Amir Oveisi
چهارشنبه 04 شهریور 1388, 03:40 صبح
چرا این امکان وجود داره که می توان از یک کلاس کاملا" مستقل ، به اعضای خصوصی ( private ) یک کلاس دیگه به شکل مستقیم دسترسی پیدا کرد؟

تو اون کدی که شما نوشتید :
Application.OpenForms["form1"].Controls["button1"].Width = 100;

این دسترسی به button1 یک دسترسی مستقیم نیست بلکه شما دارین از طریق یک Indexer که در کلاس Control تعریف شده به اون button دسترسی پیدا میکنید.
Indexer ها هم عملکردی مشابه property ها دارند.

دقت کنید که دسترسی مستقیم زمانی هست که شما چنین کدی داشته باشید:
Form1 form1 = new Form1();
form1.button1.Width = 100;

موفق باشید

alireza_tavakol
چهارشنبه 04 شهریور 1388, 05:06 صبح
using System.Reflection;

class Test { int _ID; string _Name; }

class Simple {
static void Main() {
Type type1 = typeof(Test);
FieldInfo[] fields = type1.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

foreach(FieldInfo field in fields)
Console.WriteLine("[" + field.Name + "]\tis a private field of [" + type1.Name + "] class.");

Console.ReadKey();
}
}
این کد هم توسط indexer داره به اعضای private دسترسی پیدا میکنه؟

اَرژنگ
چهارشنبه 04 شهریور 1388, 05:29 صبح
using System.Reflection;

class Test { int _ID; string _Name; }

class Simple {
static void Main() {
Type type1 = typeof(Test);
FieldInfo[] fields = type1.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

foreach(FieldInfo field in fields)
Console.WriteLine("[" + field.Name + "]\tis a private field of [" + type1.Name + "] class.");

Console.ReadKey();
}
}
این کد هم توسط indexer داره به اعضای private دسترسی پیدا میکنه؟

بله همان طوری که در پست قبلیم گفتم:
مبانی استفاده از پرایوت برایه جلوگیری غیر قابل نفوذ نیستند، برایه طبقه بندی کد برایه استفاده برنامه‌نیس هستند.
و این کد با رفلکشن این کار را انجام میده.
کلمه امنیت ربطی به استفاده از پرایوت ندارد، طبقه بندی کد فقط برایه این است که به برنامه‌نویس فقط به قسمتهایی مورد نیاز دستیابی داشته باشد و به قسمتهایی که برای استفاده اهمیت ندارند جلویه چشمش نیاد و گیجش کند.
در اینجا منظور من از طبقه بندی کد، طبقه بندی به شکل راهنمائی برایه استفاده است، و نه جلوگیری از استفاده.
در خیلی از کتابها اشتباهی استفاده از پرایوت را به این شکل توجیح میکنند:"برایه جلوگیری از دسترسی" درستش این است "برایه جلوگیری از دیده شدن و اظافه کردن به مقدار چیزهایی که برنامه نویس برایه استفاده از آن کلاس لازم دارد."
شما باید کاربردهایه مختلف را در ذهنتان جدا نگه دارید. یک سوالی که باید بپورسید این است که: در چه زمانی میخواهید کسی به هیچ وصیله به یک قسمت از کد دسترسی نداشته باشد؟

Amir Oveisi
چهارشنبه 04 شهریور 1388, 05:54 صبح
Indexer نیست اما باز هم دسیترسی مستقیم نیست و با واسطه انجام شده .

Amir Oveisi
چهارشنبه 04 شهریور 1388, 06:19 صبح
نقل قول:
نوشته شده توسط جزه آموزشی گروه همراهان /صفحه 23/
اعضایی که Private تعریف شده باشند تنها درون خود کلاس قابل استفاده هستند. متدهای private را بعضی اوقات helper method یا utility method نیز می نامند ، چون جهت کمک برای سایر متد ها نوشته می شوند.پس اگر لزمی به استفاده از اعضا کلاس در بیرون آن نیست آنها را Private تعریف نمایید.
نقل قول:
نوشته شده توسط آموزش ویژوال بیسیک دات نت 2003 در 21 روز /علیرضا زارع پور /صفحه 62 /
private دسترسی متغییر را به همان کلاسی که در آن تعریف شده محدود می کند.
نقل قول:
نوشته شده توسط برنامه نویسی با دلفی /ویراست دوم /جعفر نژاد قمی و عباس نژاد /صفحه 505/
سطح اختصاصی .اعضای موجود در این بخش از کلاس توسط متدهایی که عضو کلاس هستند قابل دستیابی است. بنابراین کاربران نمی تواند به طور مستقیم به این اعضا دسترسی داشته باشند.
نقل قول:
نوشته شده توسط راهنمای جامع JAVA/کانون نشر علوم/هربرت شیلد/مترجم قلی زاده نوری/صفحه 48/
نقطه مقابل Private ، Public است که از دستیابی به یک عضو از خارج از کلاس جلوگیری می کند.
نقل قول:
نوشته شده توسط آموزش ویژال 2005 C#‎‎ /محمد هاشمیان/صفحه 96 و 339 و 932/
موجب میشود این متد قفط توسط توابع و یا متد های دیگر داخل همان بخش استفاده شود.
/صفحه 234/ برنامه نویسان دیگر ، نمی توانند از عضو private استفاده نماییند.


توصیه می کنم حتما از کتاب های مرجعی استفاده کنید که معتبر باشن:

قسمتی از کتاب ‎‎‎.Net Platform 3.5 and C#‎‎‎ 3 انتشارات Apress - فصل 5 - DEFINING ENCAPSULATED CLASS TYPES - صفحه 163

C#‎‎‎ Access Modifiers
When working with encapsulation, you must always take into account which aspects of a type are
visible to various parts of your application. Specifically, types (classes, interfaces, structures, enumerations,
delegates) and their members (properties, methods, constructors, fields, and so forth)
are always defined using a specific keyword to control how “visible” the item is to other parts of
your application. Although C#‎‎‎ defines numerous keywords to control access, they differ on where
they can be successfully applied (type or member).

در هیچ کدوم از جملاتی که شما اشاره کردید از این منابع، به کلمه "قابلیت دیده شدن" یا "Visibility" هیچ اشاره ای نشده. و همه بر سر معنای کلیشه ای لغت Access (دسترسی) تمرکز کرده اند که البته به نظر من این یکی از بزرگترین مشکلات کتاب های فارسی یا ترجمه شده است چون یه سری الفاظ هستند که هر جوری هم که خوب و حرفه ای ترجمه بشه باز هم اون رسایی و مفهوم رسانی اصلیش رو نداره و همین مسئله نقطه شروع بسیاری از مشکلات در یادگیری مفاهیم هست.
کتاب های زبان اصلی را هرگز کنار نزارید.

موفق باشید

اَرژنگ
چهارشنبه 04 شهریور 1388, 07:44 صبح
همان طوری که می بینید توی این کتاب ها اون تعریف خاصی که شما از کلمه private کرده اید را نگفته اند . کما اینکه اگر فرض رو بر این بگذاریم که :
خب ما می توانستیم با attribute هایی همچون
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
به نتیجه ای که شما می خواستید می رسیدیم
۱.من برایه پرایوت تعریفی ندارم، همانطوری که تعریف هندانه به مزه‌اش ربطی ندارد، تعریفهایه که دادند ربطی به دلایل استفاده از پرایوت ندارد.
پیدا کردن تعریف برایه هیچ چی کم نیست، و به جز در ریاضیات جایه دیگری ندیدم که از تعریف برایه اثبات خصوصیات چیزی استفاده بشه.
من به قابلیتهایه واقعی پرایوت نگاه انداختم. دلایل قابلیتهایی که دارد را میشه از یک طرف تعریف دانست و از طرف دیگر حقیقتی است که وجود دارد. حالا در تمام کتابهایی که مثال زدید تا یک مقداری از حقیقت اینکه چی هست را ورداشته و به تعریف تبدیل کردند. همانطوری که قبلا در یکی از پستهام گفتم، تعریف به جز قبول شدن در امتحان به کار دیگری نمیاد، در زندگی واقعی و در برنامه‌نویسی کمبود تعریف نداریم. ولی حقیقت چیزه دیگریست. اگر به اصل اینکه برنامه‌نویسی چه هست نگاه بندازیم، میبینیم که ساخت یک مدل نرم افزاری از قوانینی که انتظار داریم رعایت بشه.
خود زبانهایه برنامه‌نویسی دارند سعی میکنند که یک مدل نامتناقض و کامل برایه اینکار بوجود بیارند. یکی از بزرگترین کشوف ریاضی در قرن بیستم وجود نداشتن یک سیستم کامل و نامتناقض برایه ساده‌ترین قوانین است (قوانین ساده ریاضی فقط با اعداد، نه حتی برایه قوانین پیچیده در زندگی).
حالا استفاده از پرایوت از یک لحاظ کدها را یک کلاس طبقه بندی میکند. اگر برنامه‌نویس احتیاج به اینکه کلاس چکاری انجام میده و چه خصوصیاتی را برایه کار باهش به کلاسهایه دیگر ارائه میده و چه نکاتی را لازم نیست دانست که بشه باهاش کار کرد.

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

اَرژنگ
چهارشنبه 04 شهریور 1388, 08:02 صبح
با سلام مجدد

یکی از تعابیری که به مفهوم encapsulation مربوط می شود ، مخفی سازی در پیاده سازی است.(یعنی کسی که داره از شی اتومبیل استفاده میکنه از سیستم سوخت رسانی خبر نداره و امکان دسترسی مستقیم به دریچه کاربراتور رو نداره چون دریچه کاربراتور private تعریف شده ولی کسی که داره از شی اتومبیل استفاده میکنه از پدال گاز خبر داره چون public تعریف شده ، این در حالی است که پدال گاز از سیستم سوخت رسانی خبر داره و حتی به دریچه کاربراتوری که private تعریف شده دسترسی داره چون در بدنه کلاس اتومبیل است )

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

من روی جوابی که شما دادن خیلی فکر کردم ولی تنوانستم خودم رو قانع کنم چون



حالا اگه قرار باشه این تعریف شما رو بپذیریم پس ابزار مخفی سازی چیست؟

و این دقیقا" سوالی بوده که من توی این تاپیک مطرح کردم

یعنی اگه ما به این نتیجه برسیم که private توانایی مخفی سازی 100 درصد رو نداشته باشه پس مفهوم مخفی سازی که جز لاینفک کپسوله سازی است نقض میشه پس عملا" یکی از اصول سه گاه ( وراثت - چند ریختی - کپسوله سازی )معماری شی گرا از بین میره!

با تشکر از دوستان پاسخ دهند/

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

برداشت شما از مخفی کردن با نوع مخفی کردنی که پرایوت فراهم میکند یکی نیست.
به قولی معروف:
یکی شیر است اندر بادیه که، آدم میخورد
و آن دگر شیر است اندر بادیه که آدم، میخورد

شیر و بادیه در خط اول با شیر و بادی در خط دوم مفاهیم کاملا متفاوتی را میراسنند و با این همه، هردو شیرند و بادیه!

alireza_tavakol
چهارشنبه 04 شهریور 1388, 13:38 عصر
با تشکر از دوستان عزیز که به این ابهام من پاسخ دادن

تا اینجا من به نتیجه زیر رسیدم (امید وارم نتیجه گیری من درست باشه )

معادل کلمه Modifiers در زبان فارسی "سطح دسترسی" نیست !
معادل علمی و عملی کلمه Modifiers در زبان فارسی "سطح بصری" است !

علت نتیجه گیری بالا : اعضایی که Modifiers آنها private است فقط از دید برنامه نویس های دیگر مخفی می مانند و به معنای جلوگیری از دسترسی نیست.

________________________________________

حالا سوالی که واسه من پیش میاد اینکه :

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

اَرژنگ
چهارشنبه 04 شهریور 1388, 13:59 عصر
با تشکر از دوستان عزیز که به این ابهام من پاسخ دادن

تا اینجا من به نتیجه زیر رسیدم (امید وارم نتیجه گیری من درست باشه )

معادل کلمه Modifiers در زبان فارسی "سطح دسترسی" نیست !
معادل علمی و عملی کلمه Modifiers در زبان فارسی "سطح بصری" است !

علت نتیجه گیری بالا : اعضایی که Modifiers آنها private است فقط از دید برنامه نویس های دیگر مخفی می مانند و به معنای جلوگیری از دسترسی نیست.

________________________________________

حالا سوالی که واسه من پیش میاد اینکه :

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

نه استاد!
اصلا تنها چیزی که میخواستم برسانم این نبود که کلمه فقط یک معنی دارد. اینکه دلیل استفاده از پرایوت چیها هستند.
معنی کلمه تنها را با معنیی که به خود در جاهایه مختلف میخواهد برساند اشتباه نگیرید.
فقط این نیست که از دسترسی بهش از خارج جلوگیری بشه، در داخل کلاس هم اگر بخواهید عوضش کنید ویا ورش دارید گارانتی دارید که جایه دیگری کدتتان نمیشکنه.
سعی کنید به معنی دقیق کلمه زیاد اتکا نکنید، چونکه خیلی از کلمه‌ها معنیهاشان بستگی به جایی که استفاده میشند عوض میشند.

و در مورد سوالتان: بستگی دارد به چه دلیلی برایه همچین چیزی نیاز دارید. یادتان باشه همه چی فوقش در یک زمان تبدیل میشه به ماشین کد و در حافظه هستش، هر کی بخواهد میتواند مقادیر را در حافظه تغییر بده و اینکه کد با چه زبانی نوشته شده مهم نیست.
ولی اگر به دلیل دیگری میخواهید قابل دسترسی نباشد، آن سوال جداگانه‌ایست.

modifier :
معنیش تغییر دهنده است،
access level modifier:
به معنی تغییر دهنده سطح دسترسی است.
نه به معنی غیره قابل بودن دسترسی، بلکه برایه اینکه سطح دسترسی مشهود باشد و شکی در مورد ااینکه آیا برایه کار با آن کلاس احتیاج به دانستنش دارند و یا نه.
شما هر روز خودتان در زندگی معمولی از پرایوت استفاده میکنید، اگر کسی آدرس بخواهد اینکه چند قدم باید بره را لفظا نمیگید، همینکه برو ، بپیچ ، مستقیم برو را بگید برایه کارش کافی است، ولی اگر لازم بشه میتوانید اینکه چند قدم را هم طی کند را اضافه کنید، ولی بیشتر به گمراهی طرف کمک میکند تا راهنمائیش.

alireza_tavakol
چهارشنبه 04 شهریور 1388, 19:03 عصر
سوال :
آیا میشه فیلدی توی کلاسم تعریف کنم که فقط توسط اعضای همان کلاس قابل دسترس باشه؟

جواب :


همه چی فوقش در یک زمان تبدیل میشه به ماشین کد و در حافظه هستش، هر کی بخواهد میتواند مقادیر را در حافظه تغییر بده


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

وظایف مدیر حافظه
1- اختصاص دادن حافظه به برنامه در حال اجرا
2- حفظ و نگهداری اطلاعات ذخیره شده در حافظه اختصاص یافته
3- بازیابی مقدار های ذخیره شده از حافظه
4- مدیریت بحران در مواقع کم بود حافظه
5- باز پس گیری حافظه از برنامه پایان یافته


لطفا" با یک مثال عملی نحوه تعریف یک فیلد کاملا" انحصاری در سطح کلاس را بیان نمایید؟

امید وارم از سماجت من خسته نشده باشید:خجالت: /با تشکر/:لبخندساده:

اَرژنگ
چهارشنبه 04 شهریور 1388, 19:26 عصر
لطفا" با یک مثال عملی نحوه تعریف یک فیلد کاملا" انحصاری در سطح کلاس را بیان نمایید؟


انحصاری از چه لحاض؟ پرایوت، پروتکتد و اینترنال همشان برایه انحصار دادن هستند. ولی بستگی به اینکه به چی فقط انحصار داشته باشد اصلا ممکن است که هیچ روشی وجود نداشته باشد.

اتفاقا از پشته کاریتان خوشم میاد، هر کی که برایه رسیدن به هدفش تلاش کند حبیب خداست.

alireza_tavakol
پنج شنبه 05 شهریور 1388, 00:32 صبح
آیا این امکان وجود داره که برنامه من بتونه ، مقدار متغییرهایی که توسط برنامه های دیگه توی حافظه ذخیره را تغییر دهد؟ ( مثلا" یه برنامه بنویسم که مقدار متغییر های MS-Paint تغییر بده )

الف)اگه جواب مثبت باشه ، واقعا جای بسی تاسف داره:ناراحت:
ب )اگه جواب منفی باشه ، دقیقا همان چیزی است که من دنبالش می گردم . یعنی من یک فیلد یا یک متغییر دارم ولی دوست ندارم هیچ برنامه یا متدی به اون فیلد دسترسی داشته باشه به غیر از متد های همجوارش.:متفکر:

لطفا" خیلی شفاف یکی از گزینه های بالا رو انتخاب کنید.درصورتی که گزینه ب رو انتخاب کردین یک مثال عملیاتی بزنید:افسرده:

Amir Oveisi
پنج شنبه 05 شهریور 1388, 01:17 صبح
آیا این امکان وجود داره که برنامه من بتونه ، مقدار متغییرهایی که توسط برنامه های دیگه توی حافظه ذخیره را تغییر دهد؟ ( مثلا" یه برنامه بنویسم که مقدار متغییر های MS-Paint تغییر بده )


جواب مثبته و میشه حافظه یک برنامه رو براحتی خوند. برای تغییرش کار سخت میشه اما هیچ وقت غیر ممکن نیست.

alireza_tavakol
پنج شنبه 05 شهریور 1388, 01:33 صبح
جواب مثبته و میشه حافظه یک برنامه رو براحتی خوند. برای تغییرش کار سخت میشه اما هیچ وقت غیر ممکن نیست.

پس ببخشید مدیر حافظه سیستم عامل این وسط چی کاره تشریف دارن؟:متعجب:

با این اوصاف به نظر شما امنیتی واسه داده های ذخیره شده باقی می ماند؟

ما فرض میکنیم برنامه نویس کل اطلاعاتی رو که قرار ذخیره کنه رمزنگاری میکنه ولی وقتی می فرمایید امکان این وجود داره که اطلاعات ما رو Overwrite کنند پس این می شه اختلال در روند اجرای برنامه و...:ناراحت:

Amir Oveisi
پنج شنبه 05 شهریور 1388, 02:12 صبح
این کار به این سادگی ها نیست و تقریبا غیر ممکنه، اما یادمون باشه که تو دنیای برنامه نویسی هیچ غیرممکنی وجود نداره. چون اگه وجود داشت الان نه برنامه ای کرک شده بود و نه چیزی به اسم امنیت مطرح بود.