زمان جاري : یکشنبه 16 اردیبهشت 1403 - 8:31 بعد از ظهر
نام کاربري : پسورد : يا عضويت | رمز عبور را فراموش کردم
...در حال بارگيري لطفا صبر کنيد
صفحه اصلي / نرم افزاری / يژوال بيسيک دات نت و برنامه نويسی شی گراء
ارسال پاسخ جديد
يژوال بيسيک دات نت و برنامه نويسی شی گراء
تعداد بازدید: 297
musicsari آفلاين

ارسال‌ها : 1

عضويت:14 /11 /1391

محل زندگي: ساری

سن: 22

شناسه ياهو:

تشکرها : 7

تشکر شده : 2

يژوال بيسيک دات نت و برنامه نويسی شی گراء

ويژوال بيسيک دات نت يک زبان برنامه نويسی شی گراء کامل است . اين بدان معنی است که زبان فوق از چهار اصل برنامه نويسی شی گراء يعنی : انتزاع (abstraction ) ، کپسوله سازی کد و داده  ( encapsulation  ) ، وراثت  ( inheritance) ، چند ريختی ( polymorphism ) حمايت می نمايد. در ادامه با اصول چهار گانه فوق بيشتر آشنا شده و مشاهده خواهيم کرد که هر يک از اصول فوق، چه دستاوردی را  برای پياده کنندگان نرم افزار شی گراء بدنبال خواهند داشت .
انتزاع  ( abstraction )
راديو دارای يک تيونر ، يک آنتن ، يک پيچ صدا و يک سوئيچ روشن و خاموش است . بمنظور استفاده از راديو، ضرورتی به به آگاهی از نحوه دريافت سيگنال هائی راديوئی توسط آنتن مربوطه ، تبديل آنان به سيگنال های الکتريکی ، تقويت قدرت آنان بر اساس يک مدار تقويت کننده فرکانس بالا ، نخواهد بود. در اين راستا لازم نيست از نحوه فيلتر نمودن نتايج ، تقويت و تبديل آنان به صوت ، آگاهی داشت .ما صرفا\" راديو را روشن و پس از تنظيم ايستگاه مورد علاقه خود ، از آن استفاده می نمائيم . بدين ترتيب استفاده کنندگان می توانند بدون آگاهی از جزئيات داخلی از راديو استفاده نمايند. ويژگی فوق ،  بسيار مهم بوده و امکان استفاده از راديو برای هر شخص فراهم می گردد ( نه فقط افراديکه دارای اطلاعات فنی در رابطه با نحوه عملکرد آن می باشند). بنابراين می توان اين استنباط را داشت که راديو يک شی است که بگونه ای طراحی شده است که پيچيدگی ها ی مربوط نمايان نباشد ( مخفی شدن پيچيدگی ) .
در نرم افزار شی گراء ، پيچيدگی با استفاده از انتراع ، مديريت می گردد . انتزاع ، فرآيندی است که بر اساس آن رفتار حياتی و مهم يک شی مشخص و جزئيات نامرتبط  ، حذف می گردد. يک انتزاع خوش فکر ، عموما\" ساده بوده و  سمت و سوی آن نگريستن به موضوع (شی ) از ديدگاه کاربر است . فرآيند انتزاع ، نسبت به ساختار و ماهيت شی مورد نظر متفاوت بوده و لازم است برای ايجاد يک انتزاع برتر و مناسب ، موضوع بدفعات و از زوايای متفاوت مورد بررسی قرار گيرد.مثلا\" در صورتيکه  بخواهيم  از راديو با دو هدف متفاوت : گوش دادن به موزيک و يا آمورش اصول الکترونيک ، استفاده نمائيم ، نگرش به انتزاع راديو در هر يک از موارد فوق با يکديگر متفاوت خواهد بود . 
انتزاع ، يک بايد غير قابل اتتخاب و جزء لاينفک يک شی است . مثلا\"  شی Button که در فرم های ويندوز و يا وب از آن بدفعات استفاده می گردد ، دارای متدی با نام  Click  است . متد فوق ، يک انتزاع است و چه بخواهيم و يا نخواهيم وجود خواهد داشت . ( تغيير شکل اوليه Button در زمانيکه بر روی آن کليک می گردد ).  در اين رابطه رويداد OnClick  يک انتخاب است که پياده کنندگان می توانند با توجه به سياست های موجود در نرم افزار نحوه برخورد با رويداد فوق را تبين و مشخص نمايند .

کپسوله سازی کد و داده   (encapsulation
زبانهای برنامه نويسی نظير 
C و پاسکال قادر به ايجاد ساختارهائی مشابه شی می باشند. در C ، اين ويژگی يک struct و در پاسکال از آن با نام رکورد ياد می گردد . هر دو نمونه، نوع های داده تعريف شده توسط کاربر می باشند . در هر دو زبان ، يک تابع قادر به عمل بر روی بيش از يک نوع است عکس حالت فوق نيز صادق است (بيش از يک نابع قادر به عمليات بر روی يک نوع داده است ). داده بطور کامل ارائه و آسيب پذيری خاص خود را خواهد داشت .
در مقابل وضعيت فوق ،  برنامه نويسی شی گراء بر اساس کپسوله سازی است . وضعيت شی و رفتار آن  با يکديگر نگهداری و اصطلاحا\" کپسوله می گردند. داده ئی که وضعيت  يک شی را ارائه داده بهمراه متدهائی  ( توابع و روتين ها ) که بر روی داده ها عملياتی را انجام خواهند داد ، با يکديگر و بعنوان يک واحد منسجم  ذخيره می گردند. بعبارت ديگر ، استقرار ساختمان داده ها و کدهای مربوطه جهت پردازش داده های فوق ، بمنظور رسيدن به يک هدف مشخص در يک
Box و توليد يک شی مشخص با اهداف از قبل تعريف شده ، کپسوله سازی ناميده می گردد. 
کپسوله سازی ، اغلب با نام مخفی سازی اطلاعات نيز ناميده می شود. اما با اينکه اين دو واژه در برخی حالات بجای يکديگر استفاده می گردند ، نمی توان آنان را مترادف هم در نظر گرفت . آنان دارای مفاهيمی مجزاء می باشند. کپسوله سازی ، پياده سازی يک شی را از رفتار آن  تفکيک و بنوعی محدوديتی را  بمنظور دستيابی به داده داخلی  ايجاد می نمايد . محدوديت فوق ، باعث می گردد که جزئيات خاصی از رفتار يک شی مخفی گردد . بدين ترتيب ، امکان ايجاد يک جعبه سياه فراهم که وضعيت داخلی يک شی در مقابل استفاده کنندگان وو آسيب های احتمالی حفاظت خواهد شد . 
کپسوله سازی معمولا\" با \"انتزاع \" نيز اشتباه گرفته می شود. با اينکه دو مفهوم فوق تا حدود زيادی با يکديگر مشابه  می باشند ، ولی  ايده های متفاوتی را ارائه می نمايند. انتزاع يک فرآيند بوده و شامل عمليات لازم بمنظور مشخص نمودن خصايص و رفتار يک  شی برای  پردازش است . کپسوله سازی ، مکانيزمی است که توسط  \"انتزاع \" ، پياده سازی می گردد .مثلا\" شی راديو ، تکنولوژی های متفاوتی را کپسوله نموده است ، تکنولوژی هائی که امکان درک مناسب آنان برای اغلب افراد امکان پذير نخواهد بود.
در ويژوال بيسيک دات نت ، ساختاری که امکان تعريف يک \"انتزاع \" را فراهم می نمايد ، کلاس ( 
class ) ، ناميده می شود. واژه کلاس و شی ، اغلب بجای يکديگر استفاده می گردند ، اما  شی در واقع يک نمونه از يک کلاس است . يک عنصر شامل مجموعه ای از يک و يا چندين شی نظير يک کتابخانه کلاس در يک DLL است .
توارث  (inheritance)
توارث ، قابليت تعريف يک کلاس جديد است که رفتارهای خود ( و کد ) را ااز يک کلاس موجود ، به ارث می برد. کلاس جديد ، کلاس مشتق شده و يا کلاس فرزند ، ناميده می شود . کلاس اوليه بعنوان کلاس پايه و يا مادر  ناميده می شود . 
توارث بمنظور ارائه ارتباطات از نوع \"
Is-a \" و يا \"kind-of\" ، است. يک اتومبيل يک وسيله نقليه است . يک قايق يک وسيله نقليه است . يک زيردريائی يک وسيله نقليه است . در برنامه نويسی شی گراء ، کلاس پايه \"وسيله نقليه \" ، می تواند رفتارهای عمومی تمامی انواع وسائط نقليه را مشخص می نمايد. يک کلاس زيرمجموعه که از کلاس پايه مشتق می گردد می تواند بگونه ای پياده سازی گردد که نشاندهنده رفتار نوع خاصی از يک وسيله نقليه باشد .مهمترين دستاورد توارث ، قابليت توسعه و استفاده مجدد از کد است .  علاوه بر امکان فوق ، يکی ديگر از دستاوردهای توارث ، قابليت ارتباط بين اشياء متفاوتی است که از يک شی واحد ، مشتق شده اند . 
در مقابل توارث ، نوع خاص ديگری از ازتباط  و از نوع \"
has - a\" وجود دارد . اين نوع ارتباط با استفاده از ترکيب ( Composition)  که در برخی حالات از آن با نام تجمع ( aggregation ) نيز ياد می گردد، ايجاد می گردد. ارتباط فوق، نشاندهنده اين موضوع است که  يک شی در مقابل توارث خصلت ها و رفتار خود از يک شی ديگر ، خود شامل شی ديگر است ( ترکيب خصلت ها و رفتار در مقابل توارث خصلت ها و رفتار ) .  طبيعتا\"  اتومبيل دارای يک موتور است ، اما نمی توان اين ادعا را داشت که اتومبيل نوعی از يک موتور است .
در 
++C ، نوع خاصی از توارث و با نام توارت چندگانه ، استفاده می گردد. در سناريوی فوق ، يک کلاس از بيش از يک کلاس پايه مشتق می شود . تعداد زيادی از برنامه نويسان ++C ، استفاده از توارث چندگانه  را دارای چالش های خاص خود دانسته و در موارديکه از کلاس های پايه با اسامی توابع يکسان  استفاده می گردد بکارگيری صحيح آنان برای حتی برنامه نويسان با تجربه مسائل خاص خود را بدنبال خواهد د اشت .ويژوال بيسيک دات نت ، نظير جاوا صرفا\" امکان توارث يگانه را حمايت می نمايد. 
در زمان طراحی شی گراء ، می بايست شناخت لازم و عميقی از توارث و تاثيرات آن وجود داشته باشد . ايجاد يک شی که از شی ديگر مشتق خواهد شد ، همواره عمليات آسانی نخواهد بود و با مجموعه ای از سوالات روبرو خواهيم شد . مثلا\"  آيا  دايره نوع خاصی از بيضی است ؟ آيا مربع شکل خاصی از مستطيل است ؟ . 

چند ريختی ( polymorphism  )
چندريختی ، تصور( برداشت )  اشکال متفاوت از يک شی ، است. در برنامه نويسی شی گراء ، اين انتظار وجود دارد که پتانسيل های زبان استفاده شده برخوردی مناسب و متفاوت با اشياء را در زمان اجراء داشته باشند. در موارديکه اشياء با يکديگر ارتباط برقرار می نمايند عملا\" پيام هائی را ارسال و يا دريافت می دارند . در اين راستا ، فرستنده پيام ضرورتی به آگاهی ازاينکه چه کلاسی از دريافت کننده عضوء است ، نخواهد داشت. (می تواند هر کلاس دلخواهی باشد) . شی فرستنده صرفا\"می بايست  دارای دانش لازم در ارتباط با توانائی شی دريافت کننده  بمنظور انجام يک رفتار خاص باشد. وضعيت فوق ، مهمترين مزيت چندريختی  است . 
مثلا\" فرض کنيد ما دارای يک مستطيل ، مربع و يک دايره باشيم . هر کلاس  يک 
shape بوده و هر يک دارای متدی با نام Draw می باشند که مسئوليت  تفسير و رسم شکل بر روی صفحه را بر عهده دارند. با استفاده از چند ريختی  ، می توان متدی را ايجاد که  يک شی Shape  و يا  آرايه ای  از اشياء Shape را بعنوان پارامتر دريافت نمايد. می توان مربع ، مستيطل و دايره را به اين متدها بدون هيچگونه مسئله ای پاس دهيم . (مراجعه به يک کلاس از طريق مادر آن بطور کامل معتبر و قانونی خواهد بود ). در مثال فوق ، گيرنده صرفا\" از اين موضوع که  يک Shape را دريافت که دارای متدی با نام Draw است ، آگاه  و اطلاعات خاصی در ارتباط با نوع خاص Shape  نخواهد بود. در صورتيکه Shape ، مستطيل باشد ، در ادامه نسخه Draw مربوط به مستطيل فراخوانده خواهد شد. اگر شکل مورد نظر ، مربع باشد ، نسخه  Draw مربوط به  مربع ،  فراخوانده می شود. 
مفهوم فوق را می توان از زاويه ای ديگر نيز بررسی نمود . فرض کنيد از يک نرم افزار گرافيکی کوچک  بمنظور ترسيم اشکال متفاوت استفاده می گردد و بخواهيم در يک لحظه چندين شکل را بر روی صفحه رسم نمائيم . بمنظور پياده سازی قابليت فوق ، کلاسی با نام 
Scene ، ايجاد می گردد. کلاس فوق، دارای متدی با نام Render است که يک آرايه از اشياء Shape را بعنوان ورودی دريافت می نمايد . در چنين حالتی می توان آرايه ای  از اشکال متفاوت را ايجاد و آن را برای متد Render پاس نمود . متد فوق ، قادر به تکرار بين آرايه و فراخوانی متد Draw برای رسم هر يک از عناصر آرايه است . در اين راستا و  متناسب با نوع شکل ، نسخه Draw  مربوط به شکل مورد نظر فراخوانده می گردد . متد  Render ، دارای ايده و يا اطلاعاتی  در ارتباط با نوع شکلی که در حا ل کار با آن است،  نخواهد بود.
مهمترين مزيت پياده سازی کلاس Scene و متد مربوطه آن يعنی Render ، جايگاه آنان در توسعه سيستم است . مثلا\" در صورتيکه کلاس جديدی با نام Ellipse ، اضافه گردد  ( کلاسی برای نرم افزار مربوطه ) ، ضرورتی به اعمال تغييرات در کلاس Scene وجودد نخواهد داشت . . متد Render قادر به رسم Ellipse نظير ساير اشکال خواهد بود چراکه متد فوق با اشياء مربوط يک ارتباط عمومی دارد . دراين حالت ، کلاس های Shape و Scene بدرستی با يکديگر جفت وجور شده اند. اين نوع از چند ريختی  ، عام و يا parametricpolymorphism ناميده می شود.  نوع ديگری از چند ريختی  ، Overloading
 ناميده می شود. در مدل فوق ،  يک شی دارای دو و يا بيش از دو رفتار است که دارای اسامی يکسان می باشند . متدها صرفا\" از طريق پيامهائی که دريافت می نمايند ( توسط پارامترهای متد ) مشخص خواهند شد . ايجاد يک متد مشترک با نام power  بمنظور محاسبه توان اعداد صحيح  و اعشاری ، نمونه ای مناسب در اين زمينه است . با اينکه می دانيم برای محاسبه توان اعداد صحيح و اعشاری از الگوريتم ها ی متفاوتی استفاده می گردد ، می خواهيم با داشتن يک متد از قابليت های آن بمنظور محاسبه توان اعداد صحيح و يا اعشاری استفاده نمائيم . استفاده کننده از متد Power ، با سناريوی طراحی شده درون متد کاری نداشته و صرفا\" پارامتر خود را در اختيار متد قرار خواهد داد . با تمهيداتی که درون متد پيش بينی شده است ، تصميم لازم در خصوص استفاده از روتين های جانبی ( متدهای جانبی ) بمنظور محاسبه توان اعداد صحيح و يا اعشاری يک عدد ، اتخاذ خواهد شد . 
چند ريختی ، يکی از مفاهيم و ويژگی های مهم  برنامه نويسی شی گراء بوده که انعطاف شگفت انگيزی را در ارتباط با طراحی برنامه ها بدنبال خواهد داشت .

فريمورک دات نت 
اشيائی که با استفاده از ويژوال بيسيک دات نت ايجاد می گردند، تداوم و ادامه حيات خود را مديون فريمورک دات نت می دانند. پلات فرم فوق، با استفاده از استانداردهای های باز و پروتکل هائی نظير 
XML  ، HTTP و SOAP ايجاد شده است . فريمورک دات نت ، شامل يک کتابخانه استاندارد غنی است که سرويس های اساسی را در اختيار تمامی زبانهای سازگار با دات نت ، قرار می دهند.هدف از معماری فوق ، ارائه امکانات و تسهيلات لازم برای برای ايجاد ، بکارگيری و اجراء سرويس های مبتنی بر وب است . عليرغم هدف  فوق ، فريمورک دات نت ، محلی ايده آل برای  پياده سازی تمامی انواع برنامه ها  صرفنظر از طراحی است .  برخی از مزايای معماری فوق بشرح زير می باشد :

  • عمليات توزيع شده بر اساس استانداردهای اينترنت و پروتکل هائی نظير HTTP,XML و SOAP 
  • ارائه سرويس های جهانی و بزرگ نظير Object pooling, پيام ، امنيت و تراکنش
  •  زيرساخت  مناسب بمنظور تسهيل در پياده سازی کدها و عناصر با قابليت استفاده مجدد
  • تسهيل در پياده سازی تحت وب با استفاده از استانداردهای باز .
  • ارتباط کامل بين زبانها که  دستاوردهائی نظير : توارث کلاس ها ،  Catch exceptions و اشکال زدائی بين زبان های متفاوت را بدنبال خواهد داشت .
  • بکارگيری نرم افزار در دات نت بمراتب ساده ترنسبت به گذشته خواهد بود ، چراکه تنظيمات در فايل های پيکربندی از نوع XML ذخيره و در دايرکتوری مربوط به نرم افزار ذخيره خواهند شد. در اين راستا ضرورتی به استفاده از ريجستری نخواهد بود
دو بخش بسيار مهم دات نت که توجه طراحان و پياده کنندگان نرم افزار را بسرعت بسوی خود جلب می نمايد : CLR)Common Language Runtime) و  کتابخانه کلاس دات نت است . CLR ،  سرويس های لازم برای عناصری را که تحت دات نت اجراء می گردند ، ارائه می نمايد .کتابخانه کلاس دات نت ، مجموعه ای گسترده از کلاس ها را برای هر چيزی  از دستيابی به داده گرفته تا طراحی رابط کاربر، امنيت ، شبکه و ... ارائه می نمايد. کتابخانه همچنين شامل تعاريف مورد نياز برای تمامی نوع های داده اوليه نظير : bytes,integers و string است . تمامی اين نوع ها ، از يک کلاس پايه با نام  System.object  مشتق می گردند. محدوديتی بين نوع هائی که توسط سيستم تعريف شده اند با نوع هائی که شما ايجاد می نمائيد ،وجود نخواهد داشت . هر چيزبمنزله  يک شی خواهد بود.
در گذشته ، پاس دادن يک string از يک عنصر نوشته شده به زبان ويژوال بيسيک به عنصر ديگری که با ++C نوشته شده بود ، ( و يا برعکس ) مسائل و مشکلات خاص خود را بدنبال داشت . رشته ها در ويژوال بيسيک ، مشابه رشته ها در ++C نبودند . در حقيقت،در برخی موارد خاص ، استفاده از يک عنصر نوشته شده با ++C
 از طريق ويژوال بيسيک ، بدليل تفاوت در نوع داده آنان ، غير ممکن بود. هر زبان سازگار با  دات نت ، از نوع های يکسان تعريف شده  و موجود در کتابخانه کلاس پايه استفاده می نمايد. بدين ترتيب ، با مسائل مربوط به ارتباط عملياتی بين زبانها که در گذشته شاهد آنان بوديم ، برخورد نخواهيم کرد.

CLR و قابليت های آن 
CLR ، موتور اجرائی فريمورک دات نت است . سيستم  فوق ، مديريت تمامی کدهای ترجمه شده را بر عهده خواهد داشت .کد ترجمه شده که در دات نت اجراء می گردد را کد مديريت يافته (اداره شده) می گويند. علاوه بر مسئوليت لود و اجراء يک برنامه ، CLR
 سرويس هائی را ارائه که تمامی  پياده کنندگان عناصر می توانند از مزايای آن بهره مند گردند:

  • فراخوانی و توقف threads و پردازه ها
  • چرخه حيات شی و مديريت حافظه
  • ارتباط و همبستگی بين زبان ها
  •  کد قابل استفاده در محيط های  متفاوت ( Cross-code )  و  عمليات مبتنی بر امنيت
  •  Exception handling ( حتی بين زبانها )
  • بکارگيری و مسئله ورژن سازی
  •  ارتباط بين کد اداره شده ( مديريت يافته ) و کد غير اداره شده (غيرمديريت يافته )
  • اشکال زدائی بين تمامی زبانها
Runtime ها چيزی جديدی نمی باشند . ويژوال بيسيک همواره دارای نوع خاصی از يک runtime  بوده است . ويژوال ++C ، دارای يک runtime با نام MSVCRT.DLL است . perl ، Python و SmallTalk نيز از runtimeاستفاده می نمايند. تفاوت بين اين نوع از Runtime ها و CLR در اين است که CLR بمنظور کار با چندين زبان برنامه نويسی طراحی شده است .هر برنامه ای که مقصد کمپايلر آن فريمورک دات نت باشد ، قادر به استفاده از تمامی مزايای CLR است . 
دات نت در اين رابطه قابل مقايسه با جاوا نيز می باشد . جاوا از يک 
Runtime با نام JVM)Java Virtual Machine) استفاده و صرفا\" قادر به اجراء کد نوشته شده توسط جاوا می باشد . لازم است به اين نکته مهم نيز اشاره گردد کهJVM يک مفسر است . در دات نت ، تمامی برنامه های نوشته شده با هر يک از زبان های سازگار با دانت نت ،در ايتدا به يک زبان مستقل از پردازنده ترجمه می گردند که IL)Intermediate Language) ناميده می شود( قابل مقايسه با بايت کدهای جاوا ) . IL ، نظير جاوا در زمان اجراء تفسير نمی گردد و زمانيکه کد در اولين مرتبه اجراء می گردد ، يک و يا چندين کمپايلر JIT)Just-in-time) مسئوليت ترجمه کدهای IL به کد مختص يک ماشين را برعهده می گيرند. 
ارتباط و همبستگی بين زبانها يک از مهمترين مزايای ارائه شده توسط CLR است . اگر برنامه نويسی ، کلاسی را با استفاده از ++C نوشته باشد ، می توان کلاسی در VB.NET را با استفاده از آن ايجاد نمود( توارث بين زبانها ). ويژگی فوق ، توارث بين زبان ها ناميده می گردد. اشياء نوشته شده با زبان متفاوت ديگر قادر به ارتباط عملياتی  با يکديگر می باشند . دو بخش مهم CLR که  امکان فوق را فراهم می نمايند CTS)Common Type System) و CLS)Common Language Specification)
، می باشند .

سيستم CTS 
سيستم CTS ، قوانين لازم بمنظورتبعيت يک زبان در جهت  بهره گيری از مزايای فريمورک دات نت را تعريف می نمايد. سيستم فوق، همچنين مجموعه ای از نوع های متداول و عملياتی که در بين زبان های برنامه نويسی متفاوت موجود است را تعريف و مشخص می نمايد که چگونه اين نوع ها استفاده و توسط CLR مديريت گردند ، چگونه اشياء قابليت های خود را عرضه و چگونه با يکديگر ارتباط برقرار نمايند . CTS 
 ، فونداسيون لازم بمنظور ارتباط متقابل بين زبانها در دات نت را ايجاد  می نمايد.
سيستم CLS)Common Language Specification) 
CLS ، زير مجموعه ای از CTS بوده که مسئول تشريح پارامترهای پايه و مهم استفاده شده توسط مجموعه ای گسترده از زبان های برنامه نويسی است . عناصری که از ويژگی های CLS ، استفاده می نمايند ، سازگار با CLS بوده و امکان استفاده و دستيابی به عناصر فوق ، از طريق ساير زبانهای برنامه نويسی سازگار با  دات نت ، وجود خواهد داشت . VB.NET يک زبان سازگار با CLS است . بنابراين ، هر کلاس ، شی و يا عنصری که ايجاد می گردد ، توسط ساير زبا ن های سازگار با CLS در دا ت نت ، قابل استفاده خواهد بود.
چهارشنبه 20 خرداد 1394 - 15:23
وب کاربر ارسال پيام نقل قول تشکر گزارش






برای ارسال پاسخ ابتدا باید لوگین یا ثبت نام کنید.


تمامی حقوق این قالب مربوط به همین انجمن میباشد|طراح قالب : ابزار فارسی -پشتیبانی : رزبلاگ

: