برنامه نویسی

برنامه نویسی شی گرا دقیقاً چیست؟

البته در اینجا مختصر می گویم.

اول از همه، برنامه نویسی شی گرا (یا به اختصار OOP)، یک الگوی برنامه نویسی است که بر ارسال پویا متکی است، مکانیزمی که چندشکلی و قابلیت استفاده مجدد کد را امکان پذیر می کند.

OOP کد را در اطراف مفهوم “اشیاء” که نمونه هایی از “کلاس ها” هستند، سازماندهی می کند. این کلاس ها داده ها (ویژگی ها) و رفتار (روش ها) مربوط به یک موجودیت خاص یا یک مفهوم خاص را در بر می گیرند. بله، انتزاعی است. نه، ربطی به سگ هایی که حیوان هستند و می توانند شنا کنند ندارد.

اعزام پویا، موسوم به دیر صحافی یا ارسال روش زمان اجرا، مکانیزمی در زبان های OOP است که حل می کند، در زمان اجرا، اجرای کدام روش را فراخوانی کنیم. انتخاب بر اساس نوع واقعی شی، بر اساس نوع اعلام شده آن نیست. این جادوگری به اشیاء کلاس های مختلف اجازه می دهد تا اشیاء یک سوپرکلاس مشترک در نظر گرفته شوند.

بین ارسال پویا و OOP همبستگی وجود دارد که به طور خلاصه به شرح زیر است:

  • کپسوله سازی: ارسال پویا به اشیاء اجازه می دهد تا پیاده سازی خود را از یک روش، پنهان از دنیای خارج داشته باشند.
  • وراثت: ارسال پویا از وراثت پشتیبانی می‌کند و کلاس‌های مشتق شده را قادر می‌سازد تا روش‌های کلاس‌های والد خود را لغو یا گسترش دهند.
  • چندشکلی: ارسال پویا یک توانمندسازی چندشکلی است، زیرا به یک نام روش اجازه می دهد تا با چندین پیاده سازی، بسته به نوع شی در زمان اجرا، مرتبط شود، قابلیت استفاده مجدد کد و طراحی ماژولار و تمیز را ارتقا می دهد.
  • Abstraction: ارسال پویا انتزاع را با اجازه دادن به برنامه نویسان برای تعریف یک رابط مشترک (کلاس انتزاعی یا رابط) که چندین کلاس می توانند پیاده سازی کنند، امکان پذیر می کند، در حالی که جزئیات واقعی پیاده سازی در زمان اجرا حل می شوند.

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

// Define the Shape interface
interface Shape {
    double getArea();
}

// Define a Circle class that implements Shape
class Circle implements Shape {
    private double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

// Define a Rectangle class that implements Shape
class Rectangle implements Shape {
    private double width;
    private double height;

    Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape[] shapes = new Shape[3];
        shapes[0] = new Circle(5);
        shapes[1] = new Rectangle(4, 6);
        shapes[2] = new Circle(3);

        for (Shape shape : shapes) {
            System.out.println("Area: " + shape.getArea());
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مثال بالا، الف Shape رابط با یک روش واحد تعریف شده است: getArea(). را Circle و Rectangle کلاس ها اجرا می کنند Shape رابط و پیاده سازی های خود را از روش قرارداد رابط ارائه می کنند getArea().

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

امیدوارم که شما مردم از آن لذت برده باشید، هر گونه بازخورد قابل قدردانی است.

مرحله بعدی: وارونگی کنترل (IoC) و تزریق وابستگی.

نوشته های مشابه

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

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

دکمه بازگشت به بالا