JavaRush /Java Blogu /Random-AZ /OOP prinsipləri

OOP prinsipləri

Qrupda dərc edilmişdir
Java obyekt yönümlü bir dildir. Bu o deməkdir ki, Java proqramlarını obyekt yönümlü üslubdan istifadə edərək yazmalısınız. Və bu üslub proqramda obyektlərin və siniflərin istifadəsinə əsaslanır.

OOP-un əsas prinsipləri:

OOP prinsipləri - 1Nümunələrin köməyi ilə siniflərin və obyektlərin nə olduğunu, eləcə də OOP-nin əsas prinsiplərini praktikada necə tətbiq edəcəyini anlamağa çalışaq: abstraksiya, irsiyyət, polimorfizm və inkapsulyasiya.

Obyekt nədir?

Yaşadığımız dünya obyektlərdən ibarətdir. Ətrafa baxsaq görərik ki, bizi evlər, ağaclar, maşınlar, mebellər, qab-qacaq, kompüterlər əhatə edir. Bu əşyaların hamısı obyektdir və onların hər birinin özünəməxsus xüsusiyyətləri, davranışı və məqsədi vardır. Biz obyektlərə öyrəşmişik və onlardan həmişə çox xüsusi məqsədlər üçün istifadə edirik. Məsələn, işə getməyə ehtiyacımız varsa, maşından, yemək yemək istəsək qab-qacaqdan, dincəlmək lazımdırsa, rahat divandan istifadə edirik. İnsan gündəlik həyatda problemləri həll etmək üçün obyektiv düşünməyə öyrəşmişdir. Proqramlaşdırmada obyektlərdən istifadənin səbəblərindən biri də bu idi və proqramların yaradılmasına bu cür yanaşma obyekt yönümlü adlanırdı. Bir misal verək. Təsəvvür edin ki, siz yeni telefon modeli hazırlamısınız və onun kütləvi istehsalına başlamaq istəyirsiniz. Telefon dizayneri olaraq siz onun nə üçün olduğunu, necə işləyəcəyini və hansı hissələrdən ibarət olacağını bilirsiniz (korpus, mikrofon, dinamik, naqillər, düymələr və s.). Ancaq bu hissələri necə birləşdirəcəyinizi yalnız siz bilirsiniz. Bununla belə, siz telefonları şəxsən istehsal etməyi planlaşdırmırsınız, bunun üçün bütün işçi heyətiniz var. Telefonun hissələrini necə birləşdirəcəyinizi hər dəfə izah etməli olmamaq və istehsalda olan bütün telefonların eyni çıxması üçün onları istehsal etməyə başlamazdan əvvəl bir şəkil şəklində bir rəsm çəkməlisiniz. telefonun quruluşunun təsviri. OOP-da belə təsvir, çertyoj, diaqram və ya şablon sinif adlanır ki, proqram icra edilərkən ondan obyekt yaradılır. Sinif sahələr, metodlar və konstruktordan ibarət ümumi şablon kimi hələ yaradılmamış obyektin təsviridir, obyekt isə bu təsvir əsasında yaradılmış sinfin nümunəsidir.

OOP Abstraksiya

İndi gəlin telefondan nümunə götürərək real dünyadakı obyektdən proqramdakı obyektə necə keçə biləcəyimizi düşünək. Bu rabitə vasitəsinin tarixi 100 ildən artıqdır və müasir telefon, 19-cu əsrdəki sələfindən fərqli olaraq, daha mürəkkəb bir cihazdır. Telefondan istifadə edərkən onun quruluşu və daxilində baş verən proseslər haqqında düşünmürük. Biz sadəcə olaraq telefonun tərtibatçılarının təqdim etdiyi funksiyalardan - düymələrdən və ya sensor ekrandan nömrə seçmək və zəng etmək üçün istifadə edirik. İlk telefon interfeyslərindən biri zəng etmək üçün çevirdiyiniz düymə idi. Təbii ki, bu çox əlverişli deyildi. Buna baxmayaraq, sap öz funksiyasını layiqincə yerinə yetirdi. Ən müasir və ilk telefona baxsanız, həm 19-cu əsrin sonlarına aid bir cihaz, həm də ultra müasir smartfon üçün vacib olan ən vacib detalları dərhal müəyyən edə bilərsiniz. Bu, zəng etmək (nömrə yığmaq) və zəng qəbul etməkdir. Əslində, telefonu başqa bir şey deyil, telefon edən budur. İndi biz OOP-də prinsipi tətbiq etdik - obyekt haqqında ən vacib xüsusiyyətləri və məlumatları vurğulamaq. OOP-un bu prinsipi abstraksiya adlanır. OOP-də abstraksiya həmçinin real dünya probleminin elementlərini proqramdakı obyektlər kimi təqdim etmək üsulu kimi də müəyyən edilə bilər. Abstraksiya həmişə obyektlərin və ya obyektlərin xassələri haqqında bəzi məlumatların ümumiləşdirilməsi ilə əlaqələndirilir, ona görə də əsas məsələ həll olunan problem kontekstində əhəmiyyətli məlumatı əhəmiyyətsiz məlumatdan ayırmaqdır. Bu halda bir neçə abstraksiya səviyyəsi ola bilər. Gəlin telefonlarımıza abstraksiya prinsipini tətbiq etməyə çalışaq. Birincisi, ilk gündən bu günə qədər ən çox yayılmış telefon növlərini vurğulayaq. Məsələn, onları Şəkil 1-də göstərilən diaqram şəklində təqdim etmək olar OOP prinsipləri - 2. İndi abstraksiyanın köməyi ilə obyektlərin bu iyerarxiyasında ümumi məlumatları vurğulaya bilərik: obyektlərin ümumi abstrakt növü - telefon, ümumi xarakteristikası. telefon - yaradıldığı il və ümumi interfeys - bütün telefonlar zəngləri qəbul etmək və göndərmək qabiliyyətinə malikdir. Java-da belə görünür:
public abstract class AbstractPhone {
    private int year;

    public AbstractPhone(int year) {
        this.year = year;
    }
    public abstract void call(int outputNumber);
    public abstract void ring (int inputNumber);
}
Bu mücərrəd sinfə əsaslanaraq, biz aşağıda nəzərdən keçirəcəyimiz digər əsas Java OOP prinsiplərindən istifadə etməklə proqramda yeni telefon növləri yarada biləcəyik.

İnkapsulyasiya

Abstraksiya köməyi ilə biz bütün obyektlər üçün ümumi olanı vurğulayırıq. Bununla belə, hər bir telefon modeli fərdi və digərlərindən bir qədər fərqlidir. Proqramda sərhədləri necə çəkə və bu fərdiliyi təyin edə bilərik? İstifadəçilərdən heç birinin təsadüfən və ya qəsdən telefonumuzu sındıra bilməyəcəyinə və ya bir modeli digərinə çevirməyə cəhd edə bilməyəcəyinə necə əmin ola bilərik? Həqiqi obyektlər dünyası üçün cavab aydındır: bütün hissələri telefonun korpusuna yerləşdirmək lazımdır. Axı, bunu etməsək və telefonun bütün daxili hissələrini və onları birləşdirən naqilləri kənarda qoysaq, telefonumuzun işini "yaxşılaşdırmaq" istəyən bir araşdırmaçı mütləq olacaq. Bir obyektin dizaynına və istismarına belə müdaxilənin qarşısını almaq üçün OOP inkapsulyasiya prinsipindən istifadə edir - obyektin atributlarının və davranışının bir sinifdə birləşdirildiyi, obyektin daxili icrasının gizlədildiyi OOP-nin başqa bir əsas prinsipi. istifadəçi və obyektlə işləmək üçün açıq interfeys təmin edilir. Proqramçının işi hansı atributların və metodların ictimaiyyətə açıq olacağını və hansıların obyektin daxili tətbiqi olduğunu və dəyişdirilməməli olduğunu müəyyən etməkdir.

Encapsulation və Access Control

Tutaq ki, istehsal zamanı bu barədə məlumat telefonun arxasına həkk olunur: istehsal ili və ya istehsalçı şirkətin loqosu. Bu məlumat bu modeli olduqca konkret şəkildə xarakterizə edir - onun vəziyyəti. Deyə bilərik ki, telefon tərtibatçısı bu məlumatın dəyişməzliyinə diqqət yetirdi - çətin ki, kimsə qravüranı silmək barədə düşünsün. Java dünyasında gələcək obyektlərin vəziyyəti sahələrdən istifadə edərək sinifdə təsvir edilir və metodlardan istifadə etməklə onların davranışı təsvir olunur. Vəziyyəti və davranışı dəyişdirmək imkanı sahələrə və metodlara giriş modifikatorlarından istifadə etməklə həyata keçirilir - private, protected, public, və default(standart giriş). Məsələn, biz qərara gəldik ki, yaradılış ili, telefon istehsalçısının adı və üsullardan biri sinfin daxili həyata keçirilməsinə aiddir və proqramdakı digər obyektlər tərəfindən dəyişdirilə bilməz. Koddan istifadə edərək sinfi aşağıdakı kimi təsvir etmək olar:
public class SomePhone {

    private int year;
    private String company;
    public SomePhone(int year, String company) {
        this.year = year;
        this.company = company;
    }
private void openConnection(){
    //findComutator
    //openNewConnection...
}
public void call() {
    openConnection();
    System.out.println("I'm calling a number");
}

public void ring() {
    System.out.println("Дзынь-дзынь");
}

 }
Modifikator privatesinfin sahələrini və metodlarını yalnız həmin sinif daxilində əlçatan edir. Bu o deməkdir ki, privatesahələrə xaricdən daxil olmaq mümkün deyil, privatemetodlar da çağırıla bilməz. Bir metoda girişi gizlətmək openConnectionhəm də bizə bu metodun daxili tətbiqini sərbəst şəkildə dəyişmək imkanı verir, çünki bu metodun digər obyektlər tərəfindən istifadə olunmayacağına zəmanət verilir və onların işini pozmur. Obyektimizlə işləmək üçün dəyişdiricidən callistifadə edərək metodları açıq qoyuruq . Obyektlə işləmək üçün ictimai metodların təmin edilməsi də inkapsulyasiya mexanizminin bir hissəsidir, çünki obyektə giriş tamamilə rədd edilərsə, o, faydasız olacaqdır.ringpublic

Miras

Gəlin yenidən telefon cədvəlinə baxaq. Görə bilərsiniz ki, o, aşağıda yerləşən modelin filialda yuxarıda yerləşən modellərin bütün xüsusiyyətlərinə malik olduğu bir iyerarxiyanı təmsil edir. Məsələn, smartfon rabitə üçün mobil şəbəkədən istifadə edir (mobil telefonun xüsusiyyətlərinə malikdir), simsiz və portativdir (simsiz telefonun xüsusiyyətlərinə malikdir), zəngləri qəbul edə və edə bilər (telefon xüsusiyyətlərinə malikdir). Bu halda obyekt xassələrinin irsiyyətindən danışmaq olar. Proqramlaşdırmada miras yenilərini təyin etmək üçün mövcud siniflərdən istifadə etməkdir. Mirasdan istifadə edərək smartfon sinfinin yaradılması nümunəsinə baxaq. Bütün simsiz telefonlar təkrar doldurulan akkumulyatorlarla işləyir, onların işləmə müddəti saatlarla müəyyən edilir. Beləliklə, bu xüsusiyyəti simsiz telefonlar sinfinə əlavə edək:
public abstract class WirelessPhone extends AbstractPhone {

    private int hour;

    public WirelessPhone(int year, int hour) {
        super(year);
        this.hour = hour;
    }
    }
Cib telefonları simsiz telefonun xüsusiyyətlərini miras alır, biz həmçinin bu sinifə callvə metodların tətbiqini əlavə etdik ring:
public class CellPhone extends WirelessPhone {
    public CellPhone(int year, int hour) {
        super(year, hour);
    }

    @Override
    public void call(int outputNumber) {
        System.out.println("Calling a number" + outputNumber);
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("A subscriber is calling you" + inputNumber);
    }
}
Və nəhayət, klassik mobil telefonlardan fərqli olaraq tam hüquqlu əməliyyat sisteminə malik smartfon sinfi. Siz smartfonunuza bu əməliyyat sistemi tərəfindən dəstəklənən yeni proqramlar əlavə edə, bununla da onun funksional imkanlarını genişləndirə bilərsiniz. Koddan istifadə edərək sinfi aşağıdakı kimi təsvir etmək olar:
public class Smartphone extends CellPhone {

    private String operationSystem;

    public Smartphone(int year, int hour, String operationSystem) {
        super(year, hour);
        this.operationSystem = operationSystem;
    }
public void install(String program){
    System.out.println("Installing" + program + "For" + operationSystem);
}

}
Gördüyünüz kimi, Smartphonebiz sinfi təsvir etmək üçün çox az yeni kod yaratdıq, lakin yeni funksionallıqla yeni bir sinif əldə etdik. OOP miras prinsipindən istifadə kodun miqdarını əhəmiyyətli dərəcədə azalda bilər və buna görə də proqramçının işini asanlaşdıra bilər.

Polimorfizm

Bütün telefon modellərinə nəzər salsaq, onda modellərin görünüşü və dizaynındakı fərqlərə baxmayaraq, onlarda bəzi ümumi davranışları müəyyən edə bilərik - onların hamısı zəng qəbul edə və edə bilər və kifayət qədər aydın və sadə idarəetmə düymələri dəstinə malikdir. Artıq bizə məlum olan OOP-un əsas prinsiplərindən birini proqramlaşdırma baxımından abstraksiyanı tətbiq edərək deyə bilərik ki, telefon obyekti bir ümumi interfeysə malikdir. Buna görə də, telefon istifadəçiləri cihazın texniki detallarına varmadan eyni idarəetmə düymələrindən (mexaniki və ya toxunma) istifadə edərək müxtəlif modellərdən kifayət qədər rahat istifadə edə bilərlər. Beləliklə, siz daim mobil telefondan istifadə edirsiniz və onun stasionar həmkarından asanlıqla zəng edə bilərsiniz. OOP-də proqramın obyektin daxili strukturu haqqında məlumat olmadan eyni interfeysə malik obyektlərdən istifadə edə bilməsi prinsipi polimorfizm adlanır . Təsəvvür edək ki, proqramımızda başqa istifadəçiyə zəng etmək üçün istənilən telefon modelindən istifadə edə bilən istifadəçini təsvir etməliyik. Bunu necə etmək olar:
public class User {
    private String name;

    public User(String name) {
        this.name = name;
            }

    public void callAnotherUser(int number, AbstractPhone phone){
// here it is polymorphism - using the abstract type AbstractPhone phone in the code!
        phone.call(number);
    }
}
 }
İndi müxtəlif telefon modellərini təsvir edək. İlk telefon modellərindən biri:
public class ThomasEdisonPhone extends AbstractPhone {

public ThomasEdisonPhone(int year) {
    super(year);
}
    @Override
    public void call(int outputNumber) {
        System.out.println("Turn the Handle");
        System.out.println("Give me the phone number, sir");
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("Phone calls");
    }
}
Adi stasionar telefon:
public class Phone extends AbstractPhone {

    public Phone(int year) {
        super(year);
    }

    @Override
    public void call(int outputNumber) {
        System.out.println("I'm calling a number" + outputNumber);
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("Phone calls");
    }
}
Və nəhayət, gözəl video telefon:
public class VideoPhone extends AbstractPhone {

    public VideoPhone(int year) {
        super(year);
    }
    @Override
    public void call(int outputNumber) {
        System.out.println("I connect a video channel for the subscriber" + outputNumber );
    }
    @Override
    public void ring(int inputNumber) {
        System.out.println("You have an incoming video call..." + inputNumber);
    }
  }
Metodda obyektlər yaradaq main()və metodu sınaqdan keçirək callAnotherUser:
AbstractPhone firstPhone = new ThomasEdisonPhone(1879);
AbstractPhone phone = new Phone(1984);
AbstractPhone videoPhone=new VideoPhone(2018);
User user = new User("Andrey");
user.callAnotherUser(224466,firstPhone);
// Rotate the knob
// Tell me the number of the subscriber, sir
user.callAnotherUser(224466,phone);
//Call number 224466
user.callAnotherUser(224466,videoPhone);
//I connect the video channel for subscriber 224466
Obyektdə eyni metodu çağırmaqla userfərqli nəticələr əldə etdik. callMetod daxilində konkret metodun həyata keçirilməsinin seçilməsi callAnotherUserproqramın icrası zamanı çağıran obyektin xüsusi tipinə əsasən dinamik şəkildə həyata keçirilirdi. Bu, polimorfizmin əsas üstünlüyüdür - proqramın icrası zamanı həyata keçirilməsinin seçilməsi. Yuxarıdakı telefon sinfi nümunələrində, metodun imzasını dəyişdirmədən əsas sinifdə müəyyən edilmiş metodun həyata keçirilməsini dəyişdirən metodu əvəzləmədən istifadə etdik. Bu, mahiyyətcə bir metodun dəyişdirilməsidir və proqram işlədiyi zaman çağırılan alt sinifdə müəyyən edilmiş yeni metoddur. Tipik olaraq, metodu ləğv edərkən, @Overridetərtibçiyə ləğv edilmiş və ləğv edilmiş metodların imzalarını yoxlamağı bildirən annotasiya istifadə olunur. Nəticədə , proqramınızın üslubunun OOP konsepsiyasına və OOP java prinsiplərinə uyğun olmasını təmin etmək üçün bu məsləhətlərə əməl edin:
  • obyektin əsas xüsusiyyətlərini vurğulamaq;
  • ümumi xassələri və davranışı vurğulamaq və obyektlər yaratarkən mirasdan istifadə etmək;
  • obyektləri təsvir etmək üçün abstrakt tiplərdən istifadə etmək;
  • Sinfin daxili tətbiqi ilə əlaqəli metodları və sahələri həmişə gizlətməyə çalışın.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION