تعداد بازدید: 717

OOP Paradigm fundamental

شئ گرایی یک الگوی تفکر طراحی سیستم های نرم افزاری است که این تفکر باعث نگاشت موجودیت های سیستم (Enitity) یا عملیات ها (Actions) یا منطق ها (Logics) یا سرویس ها یا حتی یک مساله (به طور مثال منطق های محاسباتی یک ماشین حساب) به یک شئ یا Object می گردد.

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

  • Inheritance : یا ارث بری که باعث گسترش کاربری یک شئ با استفاده از کاربری والد آن است.
  • Encapsulation : کپسوله سازی یا همان حفظ وضعیت داخلی (ویژگی های حیاتی) در عین ارائه یک Interface به سایر سیستم است.
  • Polymorphism : به فارسی چند ریختی است که یعنی یک عملکرد در عین نام یکسان رفتار متفاوت در اشیا متصل به هم را داشته باشد که گاها در اشیا فرزند پیشرفته تر می شود در ضمن ارث بری از عملکرد رفتار والد – Override
  • Abstraction : جدا کردن جز از کل است که ما مثلا در یک سیستم یک شئ را با ویژگی ها و رفتار های آن به صورت مجزا از سیستم تعریف و بقیه سیستم با استفاده از امکانات این شئ با آن در ارتباط خواهند بود. این رفتار از جهتی تمییز کدها از هم برای قابل فهم تر شدن سیستم نیز می باشد.

مدل سازی سیستم با اشیا

ما به صورت کلی در جاوا اسکریپت دو نوع شئ گرایی داریم که اگر چه از نظر syntax با هم کمی متفاوت هستند اما در پشت صحنه مفسر دقیقا یک ماهیت هستند. به حالت اول class based یا همان classical oop می گوییم و به حالت دوم prototyping یا حالت delegation که به فارسی حالت نمایندگی گفته می شود. حالت های متفاوتی که ما با آن می توانیم یک شئ خلق کنیم :

  1. Constructor : ساخت شئ با استفاده از Function Constructor .
  2. Prototype : تعریف یک شئ به صورت عینی یا Object Literal
  3. Class Based (Classical oop) : این بخش در ES6 به صورت رسمی جهت همگام سازی مفاهیم نرم افزاری با سایر زبان های برنامه نویسی بود.معمولا برای اجرای عملیات های مبتنی بر منظق بازی (مثلا ماشین حساب زمان سنج یا بازی ها) از Class Base استفاده می کنیم.

در برنامه نویسی شئ گرایی ما سیستم را به اشیا مختلف مدل سازی می کنیم هر شئ یک جنبه خاص از سیستم را در بر می گیرد و این شئ هم رفتار دارد و هم ویژگی (Methods , Data) . همچنین این شئ یک رابط برای کار با این شئ برای سایر بخش های کد در نظر می گیرد. حال ما با اشیا کار می کنیم (به طور مثال عملیات های اصلی روی یک موجودیت CRUD) بدون این که بدانیم در بدنه این شئ چه می گذرد. در رابطه با این نوع از مدل سازی می توان به نمودار UML اشاره کرد.

oop in js modelingزمانی که ما یک شئ در یک سیستم تعریف می کنیم این شئ را به صورت انتزاعی (abstraction) از کل سیستم می بینیم . به طور مثال در یک سیستم رزرو هتل ، اتاق یک شئ است که قرار است عملیات هایی در اختیار سایر سیستم قرار دهد. این اتاق ویژگی ها و عملیات هایی نیز دارد . به طول مثال Create یک عملیات و قیمت یک ویژگی است.

Class Constructor

کلاس به خودی خود کاربردی در جریان برنامه ندارد و این اشیا ساخته شده از شئ است که در جریان برنامه قرار دارند و ضمن ارتباط با یکدیگر اکوسیستم پردازش برنامه را فراهم می گرداند. به طور مثال ما کلاس را به یک قالب برای ساخت اشیا بتنی تعریف می کنیم به این شکل که قرار است این بتن ها یک سری ویژگی داشته باشند (مثلا درصد سیمان به آب بتن) که این ویژگی از طریق کسی که مجسمه بتنی را می سازد(سازنده کسی که ملات را قالب بتن میریزد Constructor) تعیین می گردد . پس مجسمه بتنی (Object) یک شئ از قالب بتن (Class) با ویژگی ویسکوزیته بتن(Attribute).

عملیات ساخت شئ از روی یک کلاس توسط تابع سازنده یا Class Constructor اتفاق می افتد. عملکردهای اشیا به دو حالت Dynamic و Static تقسیم بندی می شود . این دو نوع به نوع کلاس ها بر می گردد. برخی کلاس ها سازنده ندارند . به طور مثال Math که تمامی عملیات های آن به صورت static می باشد و اگر از روی آن شئ بسازید خطا خواهید داشت و برخی دیگر نیز ویژگی های داحلی (internal state) را از طریق constructor دریافت می کنند مثل کلاس Date و constructor تنها یک بار در یک شئ اتفاق می افتد و همان زمانی که ساخته می شود . این گونه اشیا متد های Dynamic هم خواهند داشت.

let m = new Math
Uncaught TypeError: Math is not a constructor
    <anonymous> debugger eval code:1

Inheritance

ارث بری یا Inheritance خود باعث بوجود آمدن الگوی پیاده سازی زیادی در سیستم های نرم افزاری شده است . این حالت برای این است که یک سری اشیا با قالب های نزدیک به هم از یک قالب مشترک ساخته شوند. پس لازمه ارث بری داشتن ویژگی های مشترک می باشد. در طرف دیگر هر شئ می تواند ویژگی و رفتار جدید خود را تعریف کند. در این قسمت ما سیستم مدرسه را با Professor , Student , Person تعریف می کنیم:

class Person
    properties
        name
    constructor
        Person(name)
    methods
        introduceSelf()

class Professor : extends Person
    properties
        teaches
    constructor
        Professor(name, teaches)
    methods
        grade(paper)
        introduceSelf()

class Student : extends Person
    properties
        year
    constructor
        Student(name, year)
    methods
        introduceSelf()

بلوک کد بالا را در نظر داشته باشید . ویژگی های مشترک میان Professor , Student , Person می توان به name اشاره کرد. همچنین اگر ما در یک سیستم عملیاتی تر در نظر داشته باشیم می توان گفت که ما اگر بخواهیم رفتار یک controller را به یک کنترلر دیگر تفهیم کنیم باید یک قالب – class – به آن ارائه کنیم.

در ارث بری می توانیم بگوییم که کلاس های فرزند نسخه هایی (version) هایی از کلاس والد هستند. به طول مثلا Professor یک نسخه از Person است.

در Inheritance ما به کلاس والد Super Class یا Parent Class می گوییم و به کلاس فرزند Sub Class یا Child Class می گوییم.

Polymorphism

این موضوع که ما یک متد را در دو کلاس متصل با یک نام و رفتار متفاوت (Different Implemention) داشته باشیم polymorphism می گوییم. به طول مثال در سیستم مدرسه که در بالا تر ذکر کردیم IntroduceSelf یک عملیات نمایش ویژگی های داخلی بود که با توجه به ویژگی های هر شئ می توانست متفاوت باشد اما تمامی موجودیت ها این قابلیت را داشتند.

عبارت کلیدی override در polymorphism رخ خواهد داد به طوری که کلاس فرزند متد کلاس والد خود را کاملا بازنویسی می کند.

Encapsulation

کپسوله سازی به منظور حفظ وضعیت اصلی یک شئ می باشد . به طور مثال شئ Date یک وضعیت اصلی و مهم دارد در قالب یک رشته تاریخ که تمامی متد های داخلی بر اساس آن عمل می کنند و در constructor یا به صورت پیش فرض مقدار دهی می شود . در زمانی که ما Interface شئ Date را به سایر بلوک های کد بدهیم این internal state باید خصوصی بماند و در این حالت لازم است که کلاس اشیا خود را کپسوله سازی کند .

کپسوله سازی به عبارتی دیگر ایجاد یک جدا کننده یا حصار میان Public Interface و Private Interface می باشد. Interface شامل عملیات ها و ویژگی ها می باشد که سایر متد ها باید با آن کار کنند. در صورتی که Private Interface طرف باشیم تنها باید متد های داخلی خود کلاس با آن در ارتباط باشد و شئ جاری در سیستم نباید آن را تغییر بدهد. این خصوصی سازی تنها در شئ گرایی به این شکل پیاده سازی است .

یکی از راه های پیاده سازی Encapsulation در کلاس ها Private کردن ویژگی های خصوصی است . در جاهایی که امکان تعریف ویژگی خصوصی با syntax نداریم نام آن را با Underscore (_) شروع می کنیم . به طور مثال _dateString

Prototype/Class Objects

دو روش اصلی در ساخت اشیا می توان به Prototype و Class اشاره کرد. این دو مشترکاتی دارند:

  • Constructor : این سازنده در Class وجود دارد و همچنین با Function هم می توانستیم ویژگی های اصلی یک شئ را مقدار دهیم کنیم.
  • Prototype Chain : این همان قابلیت ارث بری Class ها در اشیا تحت الفظ یا Object Literal می باشد.

همچنین تفاوت هایی با هم دارند که مهم ترین آن syntax متفاوت می باشد:

  • در روش class base ما می توانیم constructor متفاوت برای کلاس والد و فرزند داشته باشیم اما در Prototyping سازنده در والد و فرزند مشترک است.
  • نحوه ارث بری در Class base به صورت کلاسیک است و در Prototyping به صورت Delegation می باشد. به این شکل که

Delegation

همان طور که می دانید ما در جاوا اسکریپت بدون استفاده از کلاس هم می توانیم با استفاده از Object Literal , functions می توانیم شئ بسازیم همچنین اشیا ساخته شده از این روش قابل ارث بری و توسعه از طریق prototype می باشند. این قابلیت به وسیله ویژگی __proto__ در اشیا قابل پیاده سازی است . به شکلی که شئ والد در این Property لینک شده است . در این روند اجرا تمامی این زنجیره اتصال به صورت والد و فرزند خود یک شئ است.

delegation-prototype-chainDelegation یک الگوی برنامه نویسی در علم نرم افزار است که به شکلی که زمانی که ما یک task را از یک شئ می کنیم این task می تواند از یک شئ دیگر درخواست و اجرا گردد. به این شکل می توان گفت که شئ اول نمایند اجرای task توسط شئ دوم است .

تفاوت مهم در روش پیاده سازی Delegation این است که در روند اجرا قابل تغییر می باشند و می توان والد و یا یک عملکرد آن را در زمان اجرای اشیا در جریان برنامه تغییر داد اما در روش کلاسیک پس از تعریف کلاس دیگر در جریان دیگری از برنامه قابلیت تغییر آن را نداریم .

 

مطالب مشابه

Object Prototype

ویژگی ارث بری یا inheritance یکی از مفاهیم شئ گرایی در زبان های برنامه نویسی مبتنی بر اشیا می باشد. این قابلیت در...

JavaScript Object Basic

اشیا یک ساختمان داده مهم در جاوا اسکریپت است که به صورت کلید مقدار یک سری داده (Data or Property) و یک سری عملکرد...

Map Standard Build-in Object

در جاوا اسکریپت همه چیز شئ‌ است . هر زمان که لازم باشد یک امکان جدید در اختیار شما شما قرار بدهد یک شئ استاندارد برای...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای OOP Paradigm fundamental

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *