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

در این مقاله به موضوعات زیر می‌پردازیم:

  • شیءگرایی چیست؟
  • انواع اصول شی گرایی چیست؟
  • کاربرد اصول شیءگرایی چیست؟
  • اصول شی گرایی چیست؟ (به‌طور کامل با مثال ساده)
  • اصل انتزاع (Abstraction) در اصول شی گرایی چیست؟
  • اصل کپسوله‌سازی (Encapsulation) در اصول شی گرایی چیست؟
  • اصل چندریختی (Polymorphism) در اصول شی گرایی چیست؟
  • اصل وراثت (Inheritance) در اصول شی گرایی چیست؟

شیءگرایی چیست؟

قبل از اینکه اصول شیءگرایی را بررسی کنیم، ابتدا باید یک تعریف از شیءگرایی داشته باشیم. شیءگرایی به انگلیسی «Object Oriented Programming» به اختصار «OOP» یک روش برنامه نویسی است که در آن، برنامه به شکل مجموعه‌ای از اشیاء یا انتزاعات تشکیل می‌شود. برای آشنایی بیشتر با مفهوم شیءگرایی مقاله جامع زیر را مطالعه کنید:

انواع اصول شی گرایی چیست؟

در برنامه نویسی شیءگرا 4 اصل اساسی داریم. اصول شی گرایی عبارت‌اند از:

  1. انتزاع (Abstraction)
  2. کپسوله‌سازی (Encapsulation)
  3. چندریختی (Polymorphism)
  4. وراثت (Inheritance)

که در ادامه مقاله هر 4 اصل شیءگرایی را با مثال بررسی خواهیم کرد.

کاربرد اصول شیءگرایی چیست؟

در قسمت قبل با انواع اصول شیءگرایی آشنا شدیم. اصول برنامه نویسی شی گرا به ما کمک می‌کند تا کدهای تمیز، خوانا و ماژولار بنویسیم و از کدهای زاید و تکراری جلوگیری کنیم. در این بخش یک توضیح کوتاه درباره هر کدام از اصول شی گرایی را برای شما بیان می‌کنیم:

4 اصل شیءگرایی در برنامه نویسی

نام فارسی نام انگلیسی کاربرد
انتزاع Abstraction تمرکز بر جزئیات مهم و پنهان‌سازی جزئیات پیچیده.
کپسوله‌سازی Encapsulation محدود کردن دسترسی به جزئیات داخلی یک شیء و ارائه رابط‌های عمومی.
چندریختی Polymorphism استفاده از یک شیء به عنوان نمونه از یک کلاس مشابه.
وراثت Inheritance ارث‌بری ویژگی‌ها و رفتارها از یک کلاس به کلاس دیگر.

اصول شی گرایی چیست؟ (به‌طور کامل با مثال ساده)

در قسمت‌های قبل با انواع اصول شی گرایی آشنا شدیم و یک تعریف کلی از 4 اصل شیءگرایی را در جدول برای شما بیان کردیم. در این قسمت توضیحات کاملی درباره اصول شی گرایی همراه با مثال ساده را برای شما بیان می‌کنیم تا درک بهتری از این مسئله داشته باشید.

اصل انتزاع (Abstraction) در اصول شی گرایی چیست؟

اصل انتزاع (Abstraction) در شیءگرایی

اصل انتزاع (Abstraction) در برنامه نویسی شیءگرا چیست؟ به طور کلی «Abstraction» به معنای «انتزاع»، فرآیند حذف یا از بین بردن برخی از ویژگی‌های غیرضروری یک چیز به‌منظور کاهش، خلاصه‌سازی و به کار بردن آن در مجموعه‌ای از ویژگی‌های ضروری است.

به بیان ساده، Abstraction در شیءگرایی به معنای محدود کردن توجه به جزئیات پیچیده و تمرکز بر جزئیات مهم و اساسی است. به عبارت دیگر، Abstraction به ما اجازه می‌دهد تا بر روی مفهوم و عملکرد یک شیء تمرکز کنیم، بدون اینکه درگیر جزئیات داخلی و پیچیدگی‌های آن شیء شویم. این اصل به برنامه نویسان کمک می‌کند تا کد خود را ساده‌تر و خواناتر کنند.

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

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

در برنامه نویسی به کلاس‌هایی که قابل نمونه‌سازی باشن Concrete Classes و کلاس‌هایی که قابل نمونه‌سازی نباشن Abstract Classes می‌گوییم. منظور از نمونه‌سازی همان new کردن Class و ساخت یک شیء از آن است (در مقاله شیءگرایی چیست به مفهوم کلاس و شیء به‌طور کامل پرداختیم).

به مثال زیر توجه کنید:

<?php

abstract class Animal {

  public function walking(){
    echo "The Animal Walks";
  }
  
}

new Animal(); //Fatal error: Uncaught Error: Cannot instantiate abstract class Animal

از کلاس انتزاعی (Abstract Class) که در بالا ساختیم نمی‌توان به‌صورت مستقیم new کرد و یک شیء جدید ساخت در غیر این‌صورت با Fatal error مواجه خواهیم شد. بلکه باید یک کلاس جدید از آن ارث‌بری کرد و از این کلاس جدید یک نمونه ساخت. اما به کد زیر توجه کنید:

<?php

abstract class Animal {
  public function walking($animalName){
    echo "The " . $animalName . " Walks";
  }
}

class Cat extends Animal {
  //
}

class Dog extends Animal {
  //
}

$myCat = new Cat();
$myCat->walking("Cat"); //The Cat Walks

$myDog = new Dog();
$myDog->walking("Dog"); //The Dog Walks

در کد بالا یک Abstract Class با نام Animal ساختیم که یک متد با نام ()walking برای راه رفتن دارد. و دو کلاس معمولی دیگر با نام Cat و Dog ساختیم که از کلاس Animal ارث‌بری کرده‌اند. سپس در بیرون کلاس با کلمه کلیدی new یک شیء جدید از کلاس Cat و یک شیء جدید از کلاس Dog ساختیم. اکنون در کلاس Cat و Dog می‌توانیم از متد ()walking که در کلاس انتزاعی Animal بود استفاده کنیم چون از آن ارث‌بری کرده‌ایم.

اما چرا از انتزاع (Abstraction) در شیءگرایی استفاده می‌کنیم؟ اصل انتزاع برای پنهان‌سازی جزئیاتی است که به آن نیاز نداریم. فرض کنید تمامی حیوانات (انتزاع) یک سری رفتارها مانند خوردن غذا، آب و... دارند که در همه‌ی حیوانات مشترک است. اکنون می‌خواهیم یک کلاس سگ، گربه و فیل به برنامه خود اضافه کنیم.

حال تمامی رفتارهای مشترک را در کلاس حیوانات (انتزاعی) قرار می‌دهیم و هرجا که نیاز بود سگ، گربه و فیل از این رفتارها استفاده (ارث‌بری) می‌کنند. یعنی بدون اینکه جزئیات این رفتارها را به‌صورت تک به تک در کلاس سگ، گربه و فیل بنویسیم یکبار در کلاس حیوانات (انتزاعی) می‌نویسیم و هرجا که نیاز بود در کلاس واقعی (Concrete) از آن استفاده می‌کنیم. این کار باعث می‌شود کدهای زاید و تکراری حذف شوند.

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

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

اصل کپسوله‌سازی (Encapsulation) در اصول شی گرایی چیست؟

اصل کپسوله‌سازی (Encapsulation) در شیءگرایی

اصل کپسوله‌سازی (Encapsulation) در برنامه نویسی شیءگرا چیست؟ به طور کلی «Encapsulation» به معنای «کپسوله‌سازی»، چیزی است که غشایی دور چیزی یا چیزهای خاصی ایجاد می‌کند تا علاوه بر دور هم نگه داشتن آن‌ها در کنار یکدیگر، از آن‌ها محافظت کند. در برنامه نویسی، Encapsulation به زمانی اطلاق می‌شود که ما ویژگی‌ها (Property) ورفتارهای (Method) یک Object (شیء) را در کپسولی فرضی قرار داده و آن‌ها را کنار یکدیگر قرار دهیم.

به بیان ساده، Encapsulation در شیءگرایی، تمامی داده‌های مربوط به یک شیء را در یک کلاس جمع‌آوری می‌کند و در صورت نیاز، دسترسی از سایر کلاس‌ها یا کدهای برنامه را به آن محدود می‌کند تا تغییرات در داخل یک شیء، تاثیری روی سایر بخش‌های برنامه نداشته باشد. این کار باعث افزایش امنیت برنامه و جلوگیری از دسترسی غیرمجاز می‌شود.

برای مثال در زبان برنامه نویسی PHP سه نوع اصلاح‌کننده دسترسی (Access Modifier) داریم:

  1. Public
  2. Protected
  3. Private

برای اطلاعات بیشتر درباره اصل کپسوله‌سازی، مقاله زیر را مطالعه کنید.

اصل چندریختی (Polymorphism) در اصول شی گرایی چیست؟

اصل چندریختی (Polymorphism) در شیءگرایی

اصل چندریختی (Polymorphism) در برنامه نویسی شیءگرا چیست؟ به طور کلی «Polymorphism»، به معنای «چندریختی» یا «چندشکلی»، الهام گرفته از زبان یونانی است. Polymorphism شامل دو کلمه «poly» به معنای «بسیاری» و «morph» به معنای «اشکال» است. در پلی مورفیسم، یک شیء دارای یک نام با چندین عملکرد مختلف است.

به بیان ساده، Polymorphism در شیءگرایی این قابلیت را برای یک کلاس فراهم می‌کند که چندین پیاده‌سازی با یک نام داشته باشد. به این ترتیب، می‌توان یک عملکرد را با استفاده از یک نام یکسان در چندین کلاس مختلف تعریف کرد و بسته به نوع شیءی که در زمان اجرا استفاده می‌شود، عملکرد متفاوتی را اجرا کرد. اصلی‌ترین مزیت polymorphism این است که کد قابل استفاده مجدد، قابلیت تعمیم‌پذیری و انعطاف‌پذیری را به ارث‌بری‌ها و ارتباطات بین کلاس‌ها می‌دهد. به مثال زیر توجه کنید:

<?php

abstract class Animal {
    abstract public function makeSound();
}

class Dog extends Animal {
    public function makeSound() {
        echo "Woof! Woof!";
    }
}

class Cat extends Animal {
    public function makeSound() {
        echo "Meow! Meow!";
    }
}

$dog = new Dog();
$dog->makeSound(); // Output: Woof! Woof!

$cat = new Cat();
$cat->makeSound(); // Output: Meow! Meow!

در این مثال، ما یک کلاس انتزاعی به نام Animal داریم که یک متد انتزاعی به نام ()makeSound را تعریف می‌کند. سپس، دو کلاس Dog و Cat را از کلاس Animal ارث‌بری می‌کنیم و متد ()makeSound را برای هر کدام از این کلاس‌ها پیاده‌سازی می‌کنیم.

سپس با ایجاد شیء از کلاس Dog و کلاس Cat، متد ()makeSound را بر روی هر یک از این شیء‌ها فراخوانی می‌کنیم. با استفاده از Polymorphism، با اینکه هر دو شیء از نوع Animal هستند، اما با فراخوانی یک متد با نام یکسان ()makeSound، رفتارهای متفاوت (Woof! Woof! برای سگ و Meow! Meow! برای گربه) را اجرا می‌کنند.

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

اصل وراثت (Inheritance) در اصول شی گرایی چیست؟

اصل وراثت (Inheritance) در شیءگرایی

اصل وراثت (Inheritance) در برنامه نویسی شیءگرا چیست؟ به طور کلی «Inheritance» به معنای «وراثت» در برنامه نویسی شبیه وراثت بیولوژیکی است که در آن فرزندان صفاتی را از والدین به ارث می‌برند. در برنامه‌نویسی شیءگرا می‌توان با وراثت از کلاس موجود کلاسی را ایجاد کرد که داده‌ها و متدهای کلاس قبلی را به ارث ببرد.

به بیان ساده، Inheritance در شیءگرایی، امکان ارث‌بردن ویژگی‌ها و رفتارها از یک کلاس به کلاس دیگر را فراهم می‌کند. با استفاده از ارث‌بری، کلاس فرزند می‌تواند خصوصیات کلاس والد را در خود داشته باشد. از ارث‌بری می‌توان برای ساختاردهی منطقی‌تر و سازماندهی بهتر کلاس‌ها استفاده و کد قابل استفاده مجدد و کارایی بیشتری را فراهم کرد. همچنین، با استفاده از ارث‌ بری می‌توان روابط و ارتباطات بین کلاس‌ها را بهبود بخشید. به مثال زیر توجه کنید:

<?php

class Animal {
  public function sound($animalSound){
      echo $animalSound;
  }
}

class Cat extends Animal {
  //
}

class Dog extends Animal {
  //
}

$myCat = new Cat();
$myCat->sound("Meow"); //Meow

$myDog = new Dog();
$myDog->sound("Woof"); //Woof

در کد بالا کلاس Animal (حیوان) یک کلاس والد است و یک متد ()sound دارد که در همه‌ی حیوانات صدا وجود دارد. کلاس Cat (گربه) و کلاس Dog (سگ) کلاس‌های فرزند هستند و از کلاس والد Animal با کلمه کلیدی extends ارث‌بری کرده‌اند و هر کدام می‌توانند این صدا را از ولد خود یعنی Animal به ارث ببرند.

حال یک شیء از کلاس Cat و یک شیء از کلاس Dog با new کردن می‌سازیم. چون این کلاس‌ها از کلاس والد ارث‌بری کرده‌اند می‌توانیم از از آن‌ها به کلاس والد Animal که دارای متد ()sound است، دسترسی پیدا کرده و صدای هر حیوان را شخصی‌سازی کنیم. که در گربه صدای Meow و در سگ صدای Woof ایجاد می‌شود.

جمع‌بندی

اصول شی گرایی چیست؟ در این مقاله با انواع اصول شیءگرایی و کاربرد آن‌ها آشنا شدیم. به‌طور کلی در برنامه نویسی شیءگرا 4 اصل اساسی داریم. 4 اصل شی گرایی عبارت‌اند از: انتزاع، کپسوله‌سازی، چندریختی و وراثت که با آن‌ها به‌طور کامل آشنا شدیم. اصول شیءگرایی در برنامه نویسی به ما این امکان را می‌دهد که کدهای تمیز، خوانا و ماژولار بنویسیم و از کدهای زاید و تکراری جلوگیری کنیم. هر کدام از اصول OOP (شیءگرایی) برای شما گنگ بود لطفا در قسمت نظرات با ما در میان بگذارید.