JavaRush /Blog Java /Random-MS /prinsip OOP

prinsip OOP

Diterbitkan dalam kumpulan
hello! Pernahkah anda terfikir mengapa Java direka bentuk seperti itu? Dalam erti kata bahawa anda membuat kelas, berdasarkan mereka - objek, kelas mempunyai kaedah, dsb. Tetapi mengapa struktur bahasa sedemikian rupa sehingga program terdiri daripada kelas dan objek, dan bukan sesuatu yang lain? Mengapa konsep "objek" dicipta dan diletakkan di hadapan? Adakah semua bahasa berfungsi dengan cara ini dan, jika tidak, apakah faedah yang diberikannya kepada Java? Seperti yang anda lihat, terdapat banyak soalan :) Mari kita cuba jawab setiap satunya dalam kuliah hari ini.

Prinsip OOP:

  1. Warisan
  2. Abstraksi
  3. Enkapsulasi
  4. Polimorfisme

Apakah itu pengaturcaraan berorientasikan objek (OOP)

Sudah tentu, Java terdiri daripada objek dan kelas atas sebab tertentu. Ini bukan kehendak penciptanya, malah ciptaan mereka. Terdapat banyak bahasa lain yang berdasarkan objek. Bahasa pertama seperti itu dipanggil Simula, dan ia dicipta pada tahun 1960-an di Norway. Antara lain, Simula memperkenalkan konsep “ kelas ” dan “ kaedah ”. Prinsip pengaturcaraan berorientasikan objek - 2
Kristen Nygaard dan Ole Johan Dahl - pencipta Simula
Nampaknya Simula adalah bahasa purba mengikut piawaian pengaturcaraan, tetapi sambungan "keluarga" mereka dengan Java boleh dilihat dengan mata kasar. Kemungkinan besar, anda boleh membaca kod yang tertulis di atasnya dengan mudah dan menerangkan secara umum apa yang dilakukannya :)
Begin
  Class Rectangle (Width, Height); Real Width, Height;

   Begin
      Real Area, Perimeter;

      Procedure Update;
      Begin
        Area := Width * Height;
              OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
        Perimeter := 2*(Width + Height);
              OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
      End of Update;

      Update;
      OutText("Rectangle created: "); OutFix(Width,2,6);
      OutFix(Height,2,6); OutImage;
   End of Rectangle;

       Rectangle Class ColouredRectangle (Color); Text Color;

  Begin
      OutText("ColouredRectangle created, color = "); OutText(Color);
      OutImage;
        End of ColouredRectangle;


         Ref(Rectangle) Cr;
   Cr :- New ColouredRectangle(10, 20, "Green");
End;
Contoh kod diambil daripada artikel Simula - 50 tahun OOP . Seperti yang anda lihat, Java dan nenek moyangnya tidak begitu berbeza antara satu sama lain :) Ini disebabkan oleh fakta bahawa penampilan Simula menandakan kelahiran konsep baru - pengaturcaraan berorientasikan objek. Wikipedia memberikan takrifan OOP berikut: Pengaturcaraan berorientasikan objek (OOP) ialah metodologi pengaturcaraan berdasarkan mewakili program sebagai koleksi objek, setiap satunya adalah contoh kelas tertentu, dan kelas membentuk hierarki warisan. Ia, pada pendapat saya, sangat berjaya. Anda baru-baru ini mula mempelajari Java, tetapi hampir tidak terdapat sebarang perkataan di dalamnya yang tidak anda kenali :) Hari ini, OOP ialah metodologi pengaturcaraan yang paling biasa. Selain Java, prinsip OOP digunakan dalam banyak bahasa popular yang mungkin anda pernah dengar. Ini adalah C++ (ia digunakan secara aktif oleh pembangun permainan komputer), Objective-C dan Swift (mereka menulis program untuk peranti Apple), Python (paling banyak permintaan dalam pembelajaran mesin), PHP (salah satu bahasa pembangunan web yang paling popular), JavaScript (lebih mudah katakan apa yang mereka tidak lakukan padanya) dan banyak lagi. Sebenarnya, apakah "prinsip" OOP ini? Mari beritahu anda dengan lebih terperinci.

prinsip OOP

Ini adalah asasnya. 4 ciri utama yang bersama-sama membentuk paradigma pengaturcaraan berorientasikan objek. Memahami mereka adalah kunci untuk menjadi seorang pengaturcara yang berjaya. Prinsip pengaturcaraan berorientasikan objek - 3

Prinsip 1. Pewarisan

Berita baiknya ialah anda sudah biasa dengan beberapa prinsip OOP! :) Kami telah menemui warisan beberapa kali dalam kuliah, dan kami mempunyai masa untuk bekerja dengannya. Warisan ialah mekanisme yang membolehkan anda menerangkan kelas baharu berdasarkan kelas (ibu bapa) sedia ada. Dalam kes ini, sifat dan kefungsian kelas induk dipinjam oleh kelas baharu. Mengapa pewarisan perlu dan apakah faedah yang diberikan? Pertama sekali, penggunaan semula kod. Medan dan kaedah yang diterangkan dalam kelas induk boleh digunakan dalam kelas keturunan. Jika semua jenis kereta mempunyai 10 medan biasa dan 5 kaedah yang sama, anda hanya perlu meletakkannya dalam kelas induk Auto. Anda boleh menggunakannya dalam kelas keturunan tanpa sebarang masalah. Kelebihan pepejal: secara kuantitatif (kurang kod) dan, sebagai hasilnya, secara kualitatif (kelas menjadi lebih mudah). Pada masa yang sama, mekanisme pewarisan adalah sangat fleksibel, dan anda boleh menambah fungsi yang hilang dalam keturunan secara berasingan (beberapa medan atau tingkah laku khusus untuk kelas tertentu). Secara umum, seperti dalam kehidupan biasa: kita semua serupa dengan ibu bapa kita dalam beberapa cara, tetapi berbeza daripada mereka dalam beberapa cara :)

Prinsip 2. Abstraksi

Ini adalah prinsip yang sangat mudah. Abstraksi bermaksud menyerlahkan ciri utama, paling ketara bagi sesuatu objek dan sebaliknya - membuang yang sekunder, tidak penting. Jangan kita cipta semula roda dan ingat contoh dari kuliah lama tentang kelas. Katakan kita sedang mencipta kabinet fail pekerja syarikat. Untuk mencipta objek pekerja, kami menulis kelas Employee. Apakah ciri yang penting untuk penerangan mereka dalam fail syarikat? Nama penuh, tarikh lahir, nombor keselamatan sosial, nombor pengenalan cukai. Tetapi tidak mungkin dalam kad jenis ini kita memerlukan ketinggian, mata dan warna rambutnya. Syarikat tidak memerlukan maklumat ini tentang pekerja. Oleh itu, untuk kelas Employeekami akan menetapkan pembolehubah String name, int age, int socialInsuranceNumberdan int taxNumber, dan kami akan meninggalkan maklumat yang tidak diperlukan untuk kami, seperti warna mata, dan abstrakkannya. Tetapi jika kita mencipta katalog model foto untuk agensi, keadaan berubah secara mendadak. Untuk menerangkan model fesyen, ketinggian, warna mata dan warna rambut adalah sangat penting bagi kami, tetapi nombor TIN tidak diperlukan. Oleh itu, dalam kelas Modelkita mencipta pembolehubah String height, String hair, String eyes.

Prinsip 3: Enkapsulasi

Kami telah pun menemuinya. Enkapsulasi dalam Java bermaksud mengehadkan akses kepada data dan keupayaan untuk mengubahnya. Seperti yang anda lihat, ia berdasarkan perkataan "kapsul". Dalam "kapsul" ini kami menyembunyikan beberapa data penting untuk kami yang kami tidak mahu sesiapa pun mengubahnya. Contoh mudah dari kehidupan. Anda mempunyai nama pertama dan nama keluarga. Semua orang yang anda kenali mengenali mereka. Tetapi mereka tidak mempunyai akses untuk menukar nama pertama dan nama keluarga anda. Proses ini, mungkin dikatakan, "dirangkumkan" di pejabat pasport: anda hanya boleh menukar nama pertama dan terakhir anda di sana, dan hanya anda yang boleh melakukannya. "Pengguna" lain mempunyai akses baca sahaja kepada nama pertama dan nama keluarga anda :) Contoh lain ialah wang di pangsapuri anda. Meninggalkan mereka di hadapan mata di tengah-tengah bilik bukanlah idea yang baik. Mana-mana "pengguna" (orang yang datang ke rumah anda) akan dapat menukar nombor wang anda, i.e. jemput mereka. Adalah lebih baik untuk membungkusnya dalam peti besi. Hanya anda akan mempunyai akses dan hanya dengan kod khas. Contoh pengkapsulan yang jelas yang telah anda gunakan ialah pengubah suai akses ( private, publicdsb.) dan penetap pengambil. Jika medan agekelas Cattidak dirangkumkan, sesiapa sahaja boleh menulis:
Cat.age = -1000;
Dan mekanisme enkapsulasi membolehkan kami melindungi medan agedengan kaedah penetap, di mana kami boleh meletakkan semakan bahawa umur tidak boleh menjadi nombor negatif.

Prinsip 4. Polimorfisme

Polimorfisme ialah keupayaan untuk merawat pelbagai jenis seolah-olah mereka adalah jenis yang sama. Dalam kes ini, kelakuan objek akan berbeza bergantung pada jenis objek tersebut. Kedengaran agak rumit? Mari kita fikirkan sekarang. Mari kita ambil contoh paling mudah - haiwan. Mari buat kelas Animaldengan satu kaedah - voice(), dan dua keturunannya - Catdan Dog.
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}

public class Dog extends Animal {


   @Override
   public void voice() {
       System.out.println("Bow-wow!");
   }
}

public class Cat extends Animal {

   @Override
   public void voice() {
       System.out.println("Meow!");
   }
}
Sekarang mari cuba buat pautan Animaldan tetapkan ia objek Dog.
public class Main {

   public static void main(String[] args) {

       Animal dog = new Dog();
       dog.voice();
   }
}
Kaedah manakah yang anda fikir akan dipanggil? Animal.voice()atau Dog.voice()? Kaedah kelas akan dipanggil Dog: Woof-woof! Kami mencipta rujukan Animal, tetapi objek berkelakuan seperti Dog. Jika perlu, dia boleh berkelakuan seperti kucing, kuda atau haiwan lain. Perkara utama ialah memberikan rujukan jenis umum Animalkepada objek kelas keturunan tertentu. Ini adalah logik, kerana semua anjing adalah haiwan. Inilah yang kami maksudkan apabila kami berkata "objek akan berkelakuan berbeza bergantung pada jenis objek itu." Jika kita mencipta objek Cat
public static void main(String[] args) {

   Animal cat = new Cat();
   cat.voice();
}
kaedah itu voice()akan mengeluarkan "Meow!" Apakah maksud "keupayaan untuk bekerja dengan beberapa jenis seolah-olah ia adalah jenis yang sama"? Ini juga agak mudah. Bayangkan kita sedang mencipta salun dandanan rambut untuk haiwan. Salun rambut kami mesti boleh memotong semua haiwan, jadi kami akan membuat kaedah shear()("potong") dengan parameter Animal- haiwan yang akan kami potong.
public class AnimalBarbershop {

   public void shear(Animal animal) {

       System.out.println("The haircut is ready!");
   }
}
Dan sekarang kita boleh menghantar shearkedua-dua objek Catdan objek kepada kaedah Dog!
public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   AnimalBarbershop barbershop = new AnimalBarbershop();

   barbershop.shear(cat);
   barbershop.shear(dog);
}
Berikut ialah contoh yang jelas: kelas AnimalBarbershopberfungsi dengan jenis Catseolah- Dogolah mereka adalah jenis yang sama. Pada masa yang sama, mereka mempunyai tingkah laku Catyang berbeza Dog: mereka menggunakan suara mereka secara berbeza.

Sebab kemunculan OOP

Mengapa konsep pengaturcaraan baharu ini - OOP - timbul ? Pengaturcara mempunyai alat yang berfungsi: bahasa prosedur, contohnya. Apakah yang mendorong mereka mencipta sesuatu yang pada asasnya baru? Pertama sekali, kerumitan tugas yang mereka hadapi. Jika 60 tahun yang lalu tugas pengaturcara kelihatan seperti "kira persamaan matematik begini dan begitu", kini ia mungkin berbunyi seperti "melaksanakan 7 pengakhiran yang berbeza untuk permainan STALKER bergantung pada keputusan yang dibuat pengguna dalam momen permainan A, B, C, D , E, F dan gabungan penyelesaian ini." Tugas, seperti yang anda lihat, jelas menjadi lebih kompleks sejak beberapa dekad yang lalu. Ini bermakna jenis data telah menjadi lebih kompleks. Ini adalah satu lagi sebab untuk kemunculan OOP. Contoh dengan persamaan boleh diselesaikan dengan mudah menggunakan primitif biasa; tiada objek diperlukan di sini. Tetapi sukar untuk menerangkan masalah dengan penghujung permainan tanpa menggunakan beberapa kelas yang telah anda cipta. Tetapi pada masa yang sama, agak mudah untuk menerangkannya dalam kelas dan objek: kami jelas memerlukan kelas Permainan, kelas Stalker, kelas Ending, kelas Keputusan Pemain, kelas Momen Permainan dan sebagainya. Iaitu, walaupun tanpa mula menyelesaikan masalah, kita boleh dengan mudah membayangkan "lakaran" penyelesaiannya di kepala kita. Kerumitan masalah yang semakin meningkat telah memaksa pengaturcara untuk membahagikan masalah kepada bahagian-bahagian. Tetapi dalam pengaturcaraan prosedur ini tidak begitu mudah. Dan selalunya program itu adalah "pokok" sekumpulan cawangan dengan semua pilihan yang mungkin untuk operasinya. Bergantung pada syarat-syarat tertentu, program ini dilaksanakan di sepanjang satu cawangan atau yang lain. Untuk program kecil pilihan ini mudah, tetapi membahagikan tugas besar kepada bahagian adalah sangat sukar. Keperluan ini menjadi satu lagi sebab untuk kemunculan OOP. Konsep ini memberi pengaturcara keupayaan untuk membahagikan program kepada sekumpulan "modul" kelas, yang masing-masing melakukan bahagian tugasnya sendiri. Semua objek, berinteraksi antara satu sama lain, membentuk kerja program kami. Di samping itu, kod yang kami tulis boleh digunakan semula di tempat lain dalam program, yang juga menjimatkan banyak masa.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION