آبجی
21st February 2010, 05:03 PM
برنامهنویسی شئگرا امکان استفاده مجدد از کدهای نوشتهشده را در سیستمهای مختلف با معماریهای متفاوت بوجود آورد. یک برنامهنویس میتواند از کلاسهای ایجاد شده توسط سایر برنامهنویسان استفاده کند و کدهای خود را نیز در قالب کلاس برای استفاده در اختیار آنها قرار دهد. اگر بخواهیم اغراق کنیم، میتوان پیشبینی روزی را کرد که دیگر برنامهنویس نیازی به پیادهسازی کلاسی نخواهد داشت و تنها با جستجو در بین کلاسهای موجود میتواند آنرا بدست آورد. به عنوان مثال، فرض کنید که یک برنامهنویس احتیاج به نوشتن کدی برای کار با تاریخهای شمسی و انجام تبدیلهای مورد نیاز به تاریخهای دیگر مانند تاریخ میلادی یا قمری داشته باشد. این برنامهنویس ابتدا در مخزن کلاسها جستجو میکند تا شاید بتواند کلاسی را پیدا کند که اینکار را انجام دهد. اگر قبلا چنین کلاسی نوشته نشده باشد، خودش شروع به کدنویسی آن میکند و سپس آنرا به مخزن کلاسها اضافه میکند. از این به بعد، سایر برنامهنویسان با مراجعه به مخزن کلاسها و یافتن این کلاس دیگر نیازی به کدنویسی نخواهند داشت.
برخی از شرکتهایی که در زمینه زبانهای برنامهنویسی فعالیت میکنند از همین ویژگی استفاده کردهاند و با فراهم کردن مجموعهای از کلاسهایی که کاربرد زیادی داشتهاند و اضافهکردن آنها به زبانهای برنامهنویسی بر قدرت آن زبان افزودهاند. اینکار باعث میشود تا وقت برنامهنویس برای تکرار راه رفته دیگران به هدر نرود و همچنین او بتواند با تمرکز بر کار اصلی کیفیت آنرا بهبود بخشد. با مراجعه به همان مثال قبلی، برنامهنویسی که میخواهد یک سیستم مرخصی برای یک سازمان تولید کند دیگر نیازی به فکر کردن به کلاس تاریخ و نحوه کار با تاریخ و ساعت نخواهد داشت. او مستقیم میتواند سراغ کار اصلی خود برود یعنی دنبال کردن نحوه گرفتن مرخصی در یک سازمان، بهبودهایی که میتوان در آن لحاظ کرد، قابلیتهایی که باید در نرمافزار گنجانده شود و گزارشاتی که موردنیاز خواهد بود. با بوجودآمدن زبانهای برنامهنویسی جدید مانند C# و جاوا، کتابخانههایی که به میزان زیادی مورد استفاده بودهاند به عنوان بخشی از این زبانها ارائه شده است.
با این وجود، باید در نظر داشت که همیشه نمیتوان از مخزن مرکزی استفاده کرد چون ممکن است کاری که میخواهیم انجام دهیم آنقدر خاص باشد که بتوان آنرا منحصربهفرد خواند. در مواردی قواعد و قوانین کاری میتواند از یک سازمان به سازمان دیگر فرق کند. در چنین مواردی که نمیتوان کدی نوشت که همه بتوانند از آن استفاده کنند، تنها به کلاسهای عمومی و پایه اکتفا میکنیم.
دسترسی به کلاسها و اشیاء موجود در مخزن را میتوان در سطوح مختلفی انجام داد. در سطح اول، اشیاء موجود بر روی یک کامپیوتر تنها میتوانند توسط برنامههایی مورد استفاده قرار گیرند که بر روی همان کامپیوتر اجرا میشوند. به عنوان مثال، در شاخه Windows یک کامپیوتر فایلهای DLL زیادی وجود دارد. این فایلهای DLL کتابخانههایی از توابعی هستند که میتواند توسط سایر برنامهها مورد استفاده قرار گیرد. اگر جستجویی در شاخه Windows کامپیوتر خود برای عبارت *.dll انجام دهید، نتایج بدستآمده مشابه شکل زیر خواهد بود.
http://www.shojaee.com/articles/images/dlls.gif
هر کدام از این DLL حاوی اطلاعاتی است که برنامههای مختلف از آن برای ایجاد اشیاء موردنیاز خود استفاده میکنند. از آنجاییکه DLLها در شاخه Windows قرار دارند، برنامههای مختلف میتوانند براحتی آنها را پیدا کرده و مورد استفاده قرار دهند. از سوی دیگر، یک برنامه میتواند DLLهای خود را با کپی کردن آنها در این شاخه به اشتراک بگذارد. در ادامه، برای فهم بهتر مفاهیم کتابخانه، کلاس و شئ آنها را در قالب یک مثال C# مورد استفاده قرار میدهیم.
کتابخانهها(library) ، کلاسها(class) و اشیاء(object)
بهترین روش برای فهم مفاهیم کتابخانه، کلاس و شئ کار عملی با آنها میباشد. تا زمانیکه صحبت کردن در مورد این مفاهیم در حد حرف و تئوری باقی بماند، بعید است که بتوان درک درستی از آنها بدست آورد. در این قسمت، با استفاده از زبان C# یک کتابخانه ایجاد میکنیم.
برنامه Visual Studio.NET را باز کنید. از منوی File، گزینه New و سپس Project را انتخاب کنید. Visual C# Projects را از سمت چپ پنجره New Project انتخاب کنید و از سمت راست Class Library را انتخاب کنید. یعنی شما میخواهید یک کتابخانهای از کلاسها با زبان C# ایجاد کنید. نام کتابخانه را من MyLibrary انتخاب کردهام. دکمه OK را بزنید تا کد اولیه کتابخانه تولید شود. پنجره New Project برای این مثال، در شکل زیر نمایش داده شده است.
http://www.shojaee.com/articles/images/newproject.gif
در کد تولید شده، یک فضای نام(namespace) با عنوان MyLibrary وجود دارد. چنانچه قبلا با C# کار کرده باشید با فضای نام و کاربرد آن آشنا خواهید بود ولی ما در این قسمت با فضای نام کاری نداریم. فضای نام در حقیقت یک شناسه واحدی است که از تداخل کلاسها و متدها همنام در یک پروژه بزرگ جلوگیری میکند. این کتابخانه، تنها حاوی یک کلاس است که نام HelloClass را برای آن انتخاب کردهایم. در داخل یک کلاس، متدی با عنوان SayHelloToIran اضافه کردهایم.
پس تا اینجا یک کتابخانه داریم و یک کلاس. این کلاس قابلیت این را دارد که با استفاده از تنها متد خود در کنسول خروجی به ایران سلام کند.
using System;
namespace MyLibrary
{
public class HelloClass
{
public void DisplayHelloIran()
{
Console.WriteLine(“Hello Iran!”);
}
}
}
این برنامه را با استفاده از Build Solution کمپایل کنید. نتیجه یک فایل DLL خواهد بود که در همان مسیر برنامه و در داخل شاخه BIN ایجاد خواهد شد.
حال میخواهیم برنامهای ایجاد کنیم که از این کتابخانهای که تولید کردهایم استفاده کند و یک شئ از روی تنها کلاس آن ایجاد کند و متد DisplayHelloIran را از آن فراخوانی کند. در حقیقت، حالا میخواهیم به سراغ شئ برویم. تا حالا با کتابخانه و کلاس آشنا شدیم. کدنویسیهای مورد نیاز خود را در داخل کلاس قرار دادیم ولی هنوز چیزی در خروجی چاپ نشده است. عبارت Hello Iran! را وقتی میتوان در خروجی نوست که که یک شئ از روی کلاس HelloClass ایجاد شود و سپس متد موردنظر آن شئ فراخوانی شود. در حقیقت، کلاس توانایی اجرا شدن ندارد، اشیاء هستند که روح در کالبد بیجان کلاس میدمند. ضمن اینکه خودشان قابلیتهای کلاس را بدست میآورند پیکر بیجان او را همانطور رها میکنند تا بقیه اشیاء نیز اگر خواستند یک کپی از پیکر بیجان کلاس بگیرند و روح خود را در آن جاری کنند.
دوباره از منوی File، New و سپس Project را انتخاب کنید. حالا در پنجره New Projects، Windows Application را انتخای کنید. برای آنکه برنامه محل فایل DLL را بداند، در پنجره Solution Explorer که به صورت پیشفرض در سمت راست صفحه وجود دارد، بر روی References کلیک سمت راست کرده و Add Reference را انتخاب کنید. سپس با استفاده از Browse محل فایل DLL مورد نظر را که در این مثال همان فایل MyLibrary.dll است را به برنامه معرفی کنید. پس از اینکار، پنجره Solution Explorer مشابه شکل زیر خواهد بود.
http://www.shojaee.com/articles/images/solutionexplorer.gif
حال که برنامه کتابخانه موردنظر ما را میشناسد، میتوان از کلاس موجود در آن استفاده کرد و یک شئ تولید نمود. متد اصلی برنامه در C# متد main میباشد که در شروع برنامه دستورات داخل آن اجرا میشود. در این متد، یک شئ با نام hi از روی کلاس HelloClass ایجاد میکنیم و با فراخوانی متد DisplayHelloIran از آن عبارت Hello Iran! در خروجی نوشته خواهد شد.
using System;
using MyLibrary;
namespace ConsoleApplication1
{
class Class1
{
static void Main(string[] args)
{
HelloClass hi = new HelloClass();
hi.DisplayHelloIran();
}
}
}
استفاده از اشیاء راه دور(remote object)
همانگونه که گفته شد، استفاده از اشیاء سطوح مختلفی دارد. گفتیم که اولین سطح این است که از اشیاء توسط برنامههایی استفاده کنیم که در همان کامپیوتری اجرا میشوند که شئ هم وجود دارد. سازمانی را تصور کنید که صدها و شاید هزاران ایستگاه کاری(workstation) داشته باشد و برنامههایی که بر روی آنها اجرا میشود از اشیائی استفاده میکنند که از کلاسها و کتابخانههای مشترک ایجاد شدهاند. بنابراین اگر بخواهیم در همان سطح اول باقی بمانیم باید کلیه کتابخانههای موردنیاز را بر روی کلیه ایستگاههای کاری کپی کنیم. اینکار دردسر زیادی را برای ما بههمراه خواهد داشت. اگر تغییری در کدهای نوشتهشده ایجاد شود باید کتابخانههای محلی کلیه کامپیوترهای سازمان را بروز کنیم. برای گذر از این مشکل، میتوان کمی از سطح اول پا را فراتر گذاشت و با وارد شدن به سطح دوم، مفهوم شئ راهدور را مطرح کرد. اشیاء راه دور، اشیائی هستند که در یک کامپیوتر مرکزی ایجاد میشوند و سپس توسط کلیه کامپیوترهای موجود در شبکه میتوانند مورد استفاده قرار گیرند. این شبکه میتواند شبکه اینترنت باشد.
تکنولوژیهای زیادی وجود دارد که امکان استفاده از اشیاء راه دور را در برنامهها برای ما ممکن میسازند. از این میان میتوان به COM، CORBA، RMI و RPC اشاره کرد. هرکدام از این روشها را در ادامه همین فصل با جزیئات بیشتری بررسی خواهیم کرد. نتیجه استفاده از هر یک از این تکنولوژیها این است که میتوان کد نوشتهشده را در یک محل تغییر داد و کلیه سیستمها و برنامههای موجود در شبکه که از آن کد استفاده میکردهاند، فورا منطبق با تغییرات انجامشده کار خود را ادامه خواهند داد. شاید متوجه شده باشید که اشکال استفاده از اشیاء راه دور این است که در صورت بروز خطا در شئ راه دور، کلیه سیستمها و برنامهها دچار مشکل خواهند شد. شکل زیر نشان میدهد که چگونه یک شئ راه دور بین چندین برنامه به اشتراک گذاشته میشود.
http://www.shojaee.com/articles/images/remoteobject.gif
رسیدن به هدف اشیاء راه دور و توسعه تکنولوژی مربوطه مشکل بوده است. پیادهسازی با استفاده از تکنولوژی CORBA علاوه بر اینکه کار زیادی لازم دارد، هزینههای بالایی نیز برای خرید یک ORB بههمراه خواهد داشت. ORB سروری است که برنامهها برای استفاده از اشیاء راه دور به آن نیاز دارند. علاوه بر این، تنها درصد کمی از برنامهنویسان به صورت حرفهای با این تکنولوژی سروکار دارند و بنابراین یافتن یک متخصص در این زمینه کار سختی خواهد بود.
COM و COM+ راه حل سادهتری را برای استفاده از اشیاء راه دور ارائه کرده است. بسیاری از نرمافزارهای مورد نیاز آن از قبیل Visual Studio و Microsoft Transaction Server را میتوان براحتی و با قیمت تقریبا پایینی بدست آورد. مشکل این تکنولوژی آن است که محدود به برنامههای تحت ویندوز میشود. بنابراین نمیتوان از اشیاء راه دور در سیستم عاملهایی از قبیل UNIX استفاده کرد. علاوه بر این، همانند CORBA برای استفاده از این تکنولوژی نیز نیروهای متخصصی موردنیاز میباشد که یافتن برنامهنویسانی در این سطح براحتی امکانپذیر نیست.
تلاشهای انجام شده برای دستیابی به یک تکنولوژی اشیاء راه دور که بتوان سادهتر آنرا پیادهسازی کرد و مورد استفاده قرار داد، به تکنولوژیهای RMI و RPC منجر شد. این تکنولوژیها در حقیقت سیستمهای درخواست و پاسخ هستند و همانند یک صفحه وب عمل میکنند و اینکه آن صفحه وب چگونه به درخواست مرورگر پاسخ میدهد. مشکلی که در این تکنولوژیها وجود دارد، نحوه پیادهسازی آن است که هر شرکتی از روش مخصوص به خود استفاده میکند. بنابراین امکان سازگاری بین کارهای انجام شده در شرکتهای مختلف وجود ندارد. علاوه بر این، عدم وجود سازگاری در سطح پلاتفرم مانع از اقبال عمومی به استفاده از تکنولوژی اشیاء راه دور شده است.
شروع وبسرویسها و SOAP
در اواخر دهه ۱۹۹۰، شرکت مایکروسافت به ضعفهای موجود در تکنولوژی شئ راه دور خود یعنی COM و COM+ پیبرد. وقتیکه آنها شروع به توسعه .NET کردند، متوجه شدند که تکنولوژی شئ راه دور آنها به چیزهای جدیدی نیاز دارد تا بتواند به موفقیت برسد.
یکی از جنبههایی که مایکروسافت برای تکنولوژی شئ راه دور خود نیاز داشت، عدم وابستگی آن به پلاتفرم بود. آنها یک استاندارد مبتنی بر XML ایجاد کردند و آنرا SOAP نامیدند. SOAP ترکیبی از یک سند XML و پروتکل استانداردی بود که بتواند در سطح اینترنت مورد استفاده قرار گیرد. SOAP میتواند از پروتکلهای HTTP، FTP و SMTP برای انتقال داده استفاده نماید. توسعهدهندگان اغلب از این پروتکلها با عنوان پشته پروتکلهای وبسرویس نام میبرند.
پس از آنکه شرکت مایکروسافت استاندارد SOAP را تکمیل کرد، آنرا در اختیار کنسرسیوم وب جهانی( W3C) قرار داد تا این تکنولوژی به صورت متن-باز(open source) برای استفاده عموم در دسترس قرار گیرد. کنسرسیوم وب جهانی آنرا به یک استاندارد رسمی تبدیل کرد، سایر شرکتها شروع به توسعه تکنولوژیهای شئ راه دور مشابه و سازگار با تکنولوژی ارائه شده توسط مایکروسافت نمودند. در حال حاضر، محصولات مبتنی بر وبسرویس که برای پلاتفرمهایی مانند UNIX یا AS400 نوشته شده است، سازگار با تکنولوژیهای مایکروسافت هستند که بر روی نسخههای مختلف ویندوز در حال اجرا میباشد. دلیل این امر، استفاده مایکروسافت از تکنولوژیهای استانداردی مانند XML و پروتکلهای مختلفی میباشد که بر روی کلیه پلاتفرمها وجود دارد.
در حال حاضر، بسیاری از شرکتهایی که در زمینه زبانهای برنامهنویسی فعالیت میکنند، محصولات خود را مبتنی بر تکنولوژی وبسرویس شرکت مایکروسافت ارائه میدهند. بزودی دیگر اهمیتی نخواهد داشت که شما از چه پلاتفرم یا زبانی استفاده میکنید. با استفاده از وبسرویسها، شاید تکنولوژی اشیاء راه دور بتواند به آن هدف نهایی خود برسد زیرا وبسرویسها هم استاندارد هستند و هم ساده و شرکتهایی که در زمینه زبانهای برنامهنویسی فعالیت میکنند آنها را برای پیادهسازی راحتتر میکنند.
قبل از ادامه بحث، مهم است که تفاوت میان دو مفهوم SOAP و وبسرویس را مشخص کنیم. SOAP پروتکلی است که برای انتقال داده بر روی اینترنت مورد استفاده قرار میگیرد. یک وبسرویس از SOAP استفاده میکند تا دادههای مورد نظر خود را به یک برنامه یا صفحه وب انتقال دهد. به عنوان مثال، یک وبسرویس میتواند قیمتهای سهام را در اختیار سایر برنامهها قرار دهد، درحالیکه SOAP استانداردی است که با استفاده از آن میتوان از وبسرویس قیمت سهام در پلاتفرمهای مختلف استفاده نمود.
واژههای اختصاری:
DLL: Dynamic Link Library
COM: Component Object Model
CORBA: Common Object Request Brokerage
RMI: Remote Method Invocation
RPC: Remote Procedure Call
ORB: Object Request Broker
SOAP: Simple Object Access Protocol
منبع:
Brian Hochgurtel, Cross-Platform Web Services Using C# and Java, 2003
برخی از شرکتهایی که در زمینه زبانهای برنامهنویسی فعالیت میکنند از همین ویژگی استفاده کردهاند و با فراهم کردن مجموعهای از کلاسهایی که کاربرد زیادی داشتهاند و اضافهکردن آنها به زبانهای برنامهنویسی بر قدرت آن زبان افزودهاند. اینکار باعث میشود تا وقت برنامهنویس برای تکرار راه رفته دیگران به هدر نرود و همچنین او بتواند با تمرکز بر کار اصلی کیفیت آنرا بهبود بخشد. با مراجعه به همان مثال قبلی، برنامهنویسی که میخواهد یک سیستم مرخصی برای یک سازمان تولید کند دیگر نیازی به فکر کردن به کلاس تاریخ و نحوه کار با تاریخ و ساعت نخواهد داشت. او مستقیم میتواند سراغ کار اصلی خود برود یعنی دنبال کردن نحوه گرفتن مرخصی در یک سازمان، بهبودهایی که میتوان در آن لحاظ کرد، قابلیتهایی که باید در نرمافزار گنجانده شود و گزارشاتی که موردنیاز خواهد بود. با بوجودآمدن زبانهای برنامهنویسی جدید مانند C# و جاوا، کتابخانههایی که به میزان زیادی مورد استفاده بودهاند به عنوان بخشی از این زبانها ارائه شده است.
با این وجود، باید در نظر داشت که همیشه نمیتوان از مخزن مرکزی استفاده کرد چون ممکن است کاری که میخواهیم انجام دهیم آنقدر خاص باشد که بتوان آنرا منحصربهفرد خواند. در مواردی قواعد و قوانین کاری میتواند از یک سازمان به سازمان دیگر فرق کند. در چنین مواردی که نمیتوان کدی نوشت که همه بتوانند از آن استفاده کنند، تنها به کلاسهای عمومی و پایه اکتفا میکنیم.
دسترسی به کلاسها و اشیاء موجود در مخزن را میتوان در سطوح مختلفی انجام داد. در سطح اول، اشیاء موجود بر روی یک کامپیوتر تنها میتوانند توسط برنامههایی مورد استفاده قرار گیرند که بر روی همان کامپیوتر اجرا میشوند. به عنوان مثال، در شاخه Windows یک کامپیوتر فایلهای DLL زیادی وجود دارد. این فایلهای DLL کتابخانههایی از توابعی هستند که میتواند توسط سایر برنامهها مورد استفاده قرار گیرد. اگر جستجویی در شاخه Windows کامپیوتر خود برای عبارت *.dll انجام دهید، نتایج بدستآمده مشابه شکل زیر خواهد بود.
http://www.shojaee.com/articles/images/dlls.gif
هر کدام از این DLL حاوی اطلاعاتی است که برنامههای مختلف از آن برای ایجاد اشیاء موردنیاز خود استفاده میکنند. از آنجاییکه DLLها در شاخه Windows قرار دارند، برنامههای مختلف میتوانند براحتی آنها را پیدا کرده و مورد استفاده قرار دهند. از سوی دیگر، یک برنامه میتواند DLLهای خود را با کپی کردن آنها در این شاخه به اشتراک بگذارد. در ادامه، برای فهم بهتر مفاهیم کتابخانه، کلاس و شئ آنها را در قالب یک مثال C# مورد استفاده قرار میدهیم.
کتابخانهها(library) ، کلاسها(class) و اشیاء(object)
بهترین روش برای فهم مفاهیم کتابخانه، کلاس و شئ کار عملی با آنها میباشد. تا زمانیکه صحبت کردن در مورد این مفاهیم در حد حرف و تئوری باقی بماند، بعید است که بتوان درک درستی از آنها بدست آورد. در این قسمت، با استفاده از زبان C# یک کتابخانه ایجاد میکنیم.
برنامه Visual Studio.NET را باز کنید. از منوی File، گزینه New و سپس Project را انتخاب کنید. Visual C# Projects را از سمت چپ پنجره New Project انتخاب کنید و از سمت راست Class Library را انتخاب کنید. یعنی شما میخواهید یک کتابخانهای از کلاسها با زبان C# ایجاد کنید. نام کتابخانه را من MyLibrary انتخاب کردهام. دکمه OK را بزنید تا کد اولیه کتابخانه تولید شود. پنجره New Project برای این مثال، در شکل زیر نمایش داده شده است.
http://www.shojaee.com/articles/images/newproject.gif
در کد تولید شده، یک فضای نام(namespace) با عنوان MyLibrary وجود دارد. چنانچه قبلا با C# کار کرده باشید با فضای نام و کاربرد آن آشنا خواهید بود ولی ما در این قسمت با فضای نام کاری نداریم. فضای نام در حقیقت یک شناسه واحدی است که از تداخل کلاسها و متدها همنام در یک پروژه بزرگ جلوگیری میکند. این کتابخانه، تنها حاوی یک کلاس است که نام HelloClass را برای آن انتخاب کردهایم. در داخل یک کلاس، متدی با عنوان SayHelloToIran اضافه کردهایم.
پس تا اینجا یک کتابخانه داریم و یک کلاس. این کلاس قابلیت این را دارد که با استفاده از تنها متد خود در کنسول خروجی به ایران سلام کند.
using System;
namespace MyLibrary
{
public class HelloClass
{
public void DisplayHelloIran()
{
Console.WriteLine(“Hello Iran!”);
}
}
}
این برنامه را با استفاده از Build Solution کمپایل کنید. نتیجه یک فایل DLL خواهد بود که در همان مسیر برنامه و در داخل شاخه BIN ایجاد خواهد شد.
حال میخواهیم برنامهای ایجاد کنیم که از این کتابخانهای که تولید کردهایم استفاده کند و یک شئ از روی تنها کلاس آن ایجاد کند و متد DisplayHelloIran را از آن فراخوانی کند. در حقیقت، حالا میخواهیم به سراغ شئ برویم. تا حالا با کتابخانه و کلاس آشنا شدیم. کدنویسیهای مورد نیاز خود را در داخل کلاس قرار دادیم ولی هنوز چیزی در خروجی چاپ نشده است. عبارت Hello Iran! را وقتی میتوان در خروجی نوست که که یک شئ از روی کلاس HelloClass ایجاد شود و سپس متد موردنظر آن شئ فراخوانی شود. در حقیقت، کلاس توانایی اجرا شدن ندارد، اشیاء هستند که روح در کالبد بیجان کلاس میدمند. ضمن اینکه خودشان قابلیتهای کلاس را بدست میآورند پیکر بیجان او را همانطور رها میکنند تا بقیه اشیاء نیز اگر خواستند یک کپی از پیکر بیجان کلاس بگیرند و روح خود را در آن جاری کنند.
دوباره از منوی File، New و سپس Project را انتخاب کنید. حالا در پنجره New Projects، Windows Application را انتخای کنید. برای آنکه برنامه محل فایل DLL را بداند، در پنجره Solution Explorer که به صورت پیشفرض در سمت راست صفحه وجود دارد، بر روی References کلیک سمت راست کرده و Add Reference را انتخاب کنید. سپس با استفاده از Browse محل فایل DLL مورد نظر را که در این مثال همان فایل MyLibrary.dll است را به برنامه معرفی کنید. پس از اینکار، پنجره Solution Explorer مشابه شکل زیر خواهد بود.
http://www.shojaee.com/articles/images/solutionexplorer.gif
حال که برنامه کتابخانه موردنظر ما را میشناسد، میتوان از کلاس موجود در آن استفاده کرد و یک شئ تولید نمود. متد اصلی برنامه در C# متد main میباشد که در شروع برنامه دستورات داخل آن اجرا میشود. در این متد، یک شئ با نام hi از روی کلاس HelloClass ایجاد میکنیم و با فراخوانی متد DisplayHelloIran از آن عبارت Hello Iran! در خروجی نوشته خواهد شد.
using System;
using MyLibrary;
namespace ConsoleApplication1
{
class Class1
{
static void Main(string[] args)
{
HelloClass hi = new HelloClass();
hi.DisplayHelloIran();
}
}
}
استفاده از اشیاء راه دور(remote object)
همانگونه که گفته شد، استفاده از اشیاء سطوح مختلفی دارد. گفتیم که اولین سطح این است که از اشیاء توسط برنامههایی استفاده کنیم که در همان کامپیوتری اجرا میشوند که شئ هم وجود دارد. سازمانی را تصور کنید که صدها و شاید هزاران ایستگاه کاری(workstation) داشته باشد و برنامههایی که بر روی آنها اجرا میشود از اشیائی استفاده میکنند که از کلاسها و کتابخانههای مشترک ایجاد شدهاند. بنابراین اگر بخواهیم در همان سطح اول باقی بمانیم باید کلیه کتابخانههای موردنیاز را بر روی کلیه ایستگاههای کاری کپی کنیم. اینکار دردسر زیادی را برای ما بههمراه خواهد داشت. اگر تغییری در کدهای نوشتهشده ایجاد شود باید کتابخانههای محلی کلیه کامپیوترهای سازمان را بروز کنیم. برای گذر از این مشکل، میتوان کمی از سطح اول پا را فراتر گذاشت و با وارد شدن به سطح دوم، مفهوم شئ راهدور را مطرح کرد. اشیاء راه دور، اشیائی هستند که در یک کامپیوتر مرکزی ایجاد میشوند و سپس توسط کلیه کامپیوترهای موجود در شبکه میتوانند مورد استفاده قرار گیرند. این شبکه میتواند شبکه اینترنت باشد.
تکنولوژیهای زیادی وجود دارد که امکان استفاده از اشیاء راه دور را در برنامهها برای ما ممکن میسازند. از این میان میتوان به COM، CORBA، RMI و RPC اشاره کرد. هرکدام از این روشها را در ادامه همین فصل با جزیئات بیشتری بررسی خواهیم کرد. نتیجه استفاده از هر یک از این تکنولوژیها این است که میتوان کد نوشتهشده را در یک محل تغییر داد و کلیه سیستمها و برنامههای موجود در شبکه که از آن کد استفاده میکردهاند، فورا منطبق با تغییرات انجامشده کار خود را ادامه خواهند داد. شاید متوجه شده باشید که اشکال استفاده از اشیاء راه دور این است که در صورت بروز خطا در شئ راه دور، کلیه سیستمها و برنامهها دچار مشکل خواهند شد. شکل زیر نشان میدهد که چگونه یک شئ راه دور بین چندین برنامه به اشتراک گذاشته میشود.
http://www.shojaee.com/articles/images/remoteobject.gif
رسیدن به هدف اشیاء راه دور و توسعه تکنولوژی مربوطه مشکل بوده است. پیادهسازی با استفاده از تکنولوژی CORBA علاوه بر اینکه کار زیادی لازم دارد، هزینههای بالایی نیز برای خرید یک ORB بههمراه خواهد داشت. ORB سروری است که برنامهها برای استفاده از اشیاء راه دور به آن نیاز دارند. علاوه بر این، تنها درصد کمی از برنامهنویسان به صورت حرفهای با این تکنولوژی سروکار دارند و بنابراین یافتن یک متخصص در این زمینه کار سختی خواهد بود.
COM و COM+ راه حل سادهتری را برای استفاده از اشیاء راه دور ارائه کرده است. بسیاری از نرمافزارهای مورد نیاز آن از قبیل Visual Studio و Microsoft Transaction Server را میتوان براحتی و با قیمت تقریبا پایینی بدست آورد. مشکل این تکنولوژی آن است که محدود به برنامههای تحت ویندوز میشود. بنابراین نمیتوان از اشیاء راه دور در سیستم عاملهایی از قبیل UNIX استفاده کرد. علاوه بر این، همانند CORBA برای استفاده از این تکنولوژی نیز نیروهای متخصصی موردنیاز میباشد که یافتن برنامهنویسانی در این سطح براحتی امکانپذیر نیست.
تلاشهای انجام شده برای دستیابی به یک تکنولوژی اشیاء راه دور که بتوان سادهتر آنرا پیادهسازی کرد و مورد استفاده قرار داد، به تکنولوژیهای RMI و RPC منجر شد. این تکنولوژیها در حقیقت سیستمهای درخواست و پاسخ هستند و همانند یک صفحه وب عمل میکنند و اینکه آن صفحه وب چگونه به درخواست مرورگر پاسخ میدهد. مشکلی که در این تکنولوژیها وجود دارد، نحوه پیادهسازی آن است که هر شرکتی از روش مخصوص به خود استفاده میکند. بنابراین امکان سازگاری بین کارهای انجام شده در شرکتهای مختلف وجود ندارد. علاوه بر این، عدم وجود سازگاری در سطح پلاتفرم مانع از اقبال عمومی به استفاده از تکنولوژی اشیاء راه دور شده است.
شروع وبسرویسها و SOAP
در اواخر دهه ۱۹۹۰، شرکت مایکروسافت به ضعفهای موجود در تکنولوژی شئ راه دور خود یعنی COM و COM+ پیبرد. وقتیکه آنها شروع به توسعه .NET کردند، متوجه شدند که تکنولوژی شئ راه دور آنها به چیزهای جدیدی نیاز دارد تا بتواند به موفقیت برسد.
یکی از جنبههایی که مایکروسافت برای تکنولوژی شئ راه دور خود نیاز داشت، عدم وابستگی آن به پلاتفرم بود. آنها یک استاندارد مبتنی بر XML ایجاد کردند و آنرا SOAP نامیدند. SOAP ترکیبی از یک سند XML و پروتکل استانداردی بود که بتواند در سطح اینترنت مورد استفاده قرار گیرد. SOAP میتواند از پروتکلهای HTTP، FTP و SMTP برای انتقال داده استفاده نماید. توسعهدهندگان اغلب از این پروتکلها با عنوان پشته پروتکلهای وبسرویس نام میبرند.
پس از آنکه شرکت مایکروسافت استاندارد SOAP را تکمیل کرد، آنرا در اختیار کنسرسیوم وب جهانی( W3C) قرار داد تا این تکنولوژی به صورت متن-باز(open source) برای استفاده عموم در دسترس قرار گیرد. کنسرسیوم وب جهانی آنرا به یک استاندارد رسمی تبدیل کرد، سایر شرکتها شروع به توسعه تکنولوژیهای شئ راه دور مشابه و سازگار با تکنولوژی ارائه شده توسط مایکروسافت نمودند. در حال حاضر، محصولات مبتنی بر وبسرویس که برای پلاتفرمهایی مانند UNIX یا AS400 نوشته شده است، سازگار با تکنولوژیهای مایکروسافت هستند که بر روی نسخههای مختلف ویندوز در حال اجرا میباشد. دلیل این امر، استفاده مایکروسافت از تکنولوژیهای استانداردی مانند XML و پروتکلهای مختلفی میباشد که بر روی کلیه پلاتفرمها وجود دارد.
در حال حاضر، بسیاری از شرکتهایی که در زمینه زبانهای برنامهنویسی فعالیت میکنند، محصولات خود را مبتنی بر تکنولوژی وبسرویس شرکت مایکروسافت ارائه میدهند. بزودی دیگر اهمیتی نخواهد داشت که شما از چه پلاتفرم یا زبانی استفاده میکنید. با استفاده از وبسرویسها، شاید تکنولوژی اشیاء راه دور بتواند به آن هدف نهایی خود برسد زیرا وبسرویسها هم استاندارد هستند و هم ساده و شرکتهایی که در زمینه زبانهای برنامهنویسی فعالیت میکنند آنها را برای پیادهسازی راحتتر میکنند.
قبل از ادامه بحث، مهم است که تفاوت میان دو مفهوم SOAP و وبسرویس را مشخص کنیم. SOAP پروتکلی است که برای انتقال داده بر روی اینترنت مورد استفاده قرار میگیرد. یک وبسرویس از SOAP استفاده میکند تا دادههای مورد نظر خود را به یک برنامه یا صفحه وب انتقال دهد. به عنوان مثال، یک وبسرویس میتواند قیمتهای سهام را در اختیار سایر برنامهها قرار دهد، درحالیکه SOAP استانداردی است که با استفاده از آن میتوان از وبسرویس قیمت سهام در پلاتفرمهای مختلف استفاده نمود.
واژههای اختصاری:
DLL: Dynamic Link Library
COM: Component Object Model
CORBA: Common Object Request Brokerage
RMI: Remote Method Invocation
RPC: Remote Procedure Call
ORB: Object Request Broker
SOAP: Simple Object Access Protocol
منبع:
Brian Hochgurtel, Cross-Platform Web Services Using C# and Java, 2003