در شیگرایی در آموزش برنامه نویسی بلاکچین یادگیری انتزاع یا Abstraction کافی نیست. بلکه باید آن رو درک کنیم و با درک صحیح آن، دیدمان به دنیای شیگرایی وسیعتر و باز تر خواهد شد.
اینکه ویژگی کلاسهای Abstract و اینترفیسها چیست به تنهایی مهم نیست. مهم این است که درک کنیم این موارد در کجا استفاده میشوند و برای چه کاری مفید هستند. با این مثال ها شروع میکنیم:
با گفتن کلمه “ماشین” آیا ماشین خاصی به به ذهنتان حطور میکند؟ کلمه “پرنده” چطور؟ آیا پرنده خاصی به را مد نظر میگیرید ؟ درست است جواب نه است.
کلمات “ماشین” و “پرنده” انتزاعی میباشند. یعنی مفاهیم و مدلهای ذهنی که به خودی خود در دنیای واقعی وجود ندارند و قابل پیادهسازی نیستند.
در دنیای واقعی و چیزی که با چشم میبینیم نوعهای خاصی از پرنده یا ماشین هستند. مثلاً عقاب، کبوتر و گنجشک همه نوعی از پرنده هستند. همچنین پراید و سمند نوعی از ماشین و حالتهای عینی و پیادهسازی شدهی یک ماشین هستند. ماشین یک انتزاع است. پرنده یک انتزاع گربه هست.
در این مثال، ماشین و پرنده مفاهیم انتزاعی (Abstract) هستند که قابل پیادهسازی نیستند. بلکه فقط الگو و طرحی هستند برای چیزهای عینی و قابل پیادهسازی. به عقاب و پراید قرمز و هر چیزی توی دنیای واقعی وجود دارند و ما آنها رو میبینیم، Concrete یعنی واقعی میگویند.
مفاهیم انتزاعی، یک طرح کلی و “الگو” هستند برای چیزهای عینی. چند مثال از الگو، و چیزهای عینی از آن :
اگر به مغازه خشکبار برویم و بگوییم آجیل میخواهیم، مطمئناً فروشنده از ما میپرسد چه نوع آجیلی! چون آجیل یک مفهموم کلی و انتزاعی هست.
در برنامهنویسی شیگرا مفاهیم Abstract و Concrete هم وجود دارند.
به کلاسهایی که قابل نمونهسازی باشند Concrete Classes و کلاسهایی که قابل نمونهسازی نباشند Abstract Classes میگویند .
اینترفیسها و کلاسهای Abstract ابزاری هستند برای مفاهیم انتزاعی.
پیشنهاد ویژه: آموزش رایگان سالیدیتی
همونطور که احتمالاً تا الان باید متوجه شده باشید، میدانیم که موارد انتزاعی قابل پیاده سازی نیستند. در برنامهنویسی شیگرا هم از اینترفیسها و کلاسهای Abstract نمیتوان نمونه ساخت:
متد add یک سری اشیا رو بررسی میکند که اگر از نوع پرتقال، سیب، موز و هر نوع میوهی دیگه بودند، به سبد میوه اضافه کند. همونطور که دیدید اگه هر نوع میوه دیگری رو بخواهیم اضافه کنیم باید متد add را دستکاری کنیم:
با استفاده از یک اینترفیس یا کلاس Abstract خیلی بهتر میتوانیم برنامه را بازنویسی کنیم :
اینطوری متد add وابسته به کلاسهای بینهایت Concrete نیست. بلکه وابسته به انتزاع هست. پس میتوانیم هر چقدر که میخواهیم کلاس میوه اضافه کنیم؛ بدون اینکه کلاس FruitsBasket و متد add را دستکاری کنیم.
در مثال زیر، یک قرارداد انتزاعی ایجاد می شود که توسط قرارداد دیگری که تمام وظایف قرارداد انتزاعی را اجرا کرده است، به ارث می رسد. نمونه قرارداد انتزاعی در قرارداد فراخوان ایجاد می شود و یک شی از قرارداد فرزند ایجاد می شود. با استفاده از شیء قرارداد فرزند، تمام توابع انتزاعی که در قرارداد فرزند اجرا می شوند، فراخوانی می شوند.
در اینجا، قرارداد انتزاعی یک قرارداد انتزاعی است که برخی از وظایف را بدون اجرای آنها دارد و قرارداد مشتق شده قرارداد فرزند آن است.
توابع getStr() و setValues() رشته و مقادیر را می گیرد، در حالی که تابع add() مقادیر تابع setValues() را اضافه می کند.
abs یک شی از abstractContract است که نمونه ای از قرارداد مشتق شده را در قرارداد فراخوانی ایجاد می کند که از متغیرهای قرارداد استفاده می کند و توابع را فراخوانی می کند.