JavaRush /Blog Java /Random-MS /Pengaturcaraan berorientasikan objek (terjemahan artikel)...
Exidnus
Tahap
Санкт-Петербург

Pengaturcaraan berorientasikan objek (terjemahan artikel)

Diterbitkan dalam kumpulan
Daripada penterjemah: Malangnya, saya tidak mempunyai pengalaman penting dalam menterjemah daripada bahasa Inggeris, walaupun saya membaca agak banyak dalam bahasa Inggeris. Tetapi ternyata membaca dan menterjemah adalah dua perkara yang berbeza. Juga, malangnya, saya tidak mempunyai pengalaman pengaturcaraan yang ketara (baru-baru ini saya baru sahaja membuat aplikasi web mudah dalam Spring MVC dan Hibernate). Oleh itu, terjemahan itu ternyata lebih buruk daripada yang sepatutnya. Saya mengambil kebebasan untuk membetulkan sedikit contoh kod yang diberikan dalam artikel, kerana ia tidak mematuhi konvensyen penamaan di Jawa. Mungkin ia tidak berbaloi untuk menterjemah nama beberapa corak (terjemahan sedemikian tidak memberikan banyak pemahaman), tetapi saya fikir ini adalah kejahatan yang lebih kecil. Perlu disebut secara berasingan tentang "kesepaduan tinggi" sebagai terjemahan "kesepaduan tinggi". Saya setuju, bukan terjemahan terbaik. Tetapi "sambungan yang kuat" ialah "gandingan tinggi" (satu lagi konsep penting), dan "kesepaduan" mungkin tidak sesuai di sini. Saya terbuka kepada kritikan dan dengan penuh rasa terima kasih akan menerima ulasan mengenai artikel itu dalam apa jua bentuk. Pengaturcaraan berorientasikan objek ialah gaya pengaturcaraan di mana program terdiri daripada komponen yang sepadan dengan objek dunia sebenar. Mana-mana objek sebenar mempunyai beberapa sifat (yang mungkin berubah atau mungkin tidak dari semasa ke semasa) dan tingkah laku (yang mungkin atau mungkin tidak. berubah bergantung kepada orang lain).syarat). Sebagai contoh, pensel ialah objek dunia sebenar yang mempunyai sifat berikut:
  • Ia berwarna merah (ini tidak berubah dari semasa ke semasa).
  • Panjangnya 10 sentimeter sekarang (ini mungkin berubah jika pensel diasah).
Dan ia mempunyai tingkah laku berikut:
  • Ia meninggalkan tanda jika digunakan dengan betul.
  • Jejak mungkin berbeza bergantung pada tekanan (bergantung kepada faktor luaran).
  • Panjangnya memendek apabila diasah (tingkah laku kekal).
Seperti dalam contoh ini, objek dunia sebenar boleh mempunyai banyak sifat, tetapi apabila menulis program kita hanya mengambil kira sifat yang diperlukan. Pengaturcaraan berorientasikan objek mempunyai kelebihannya. Sebagai contoh, ia memudahkan untuk mewujudkan hubungan antara objek dunia sebenar dan program dengan cara yang diharapkan. Ini benar-benar membantu apabila aplikasi berkembang dan banyak objek berinteraksi antara satu sama lain. Ini membantu dalam mengagihkan tanggungjawab dalam dunia objektif, membolehkan anda menumpukan pada pemikiran melalui aplikasi. Satu lagi ciri penting yang dikaitkan dengan OOP (Pengaturcaraan Berorientasikan Objek) ialah pengelasan objek. Oleh kerana dunia (nyata/maya) penuh dengan objek, sukar untuk mengawalnya secara individu. Kami memerlukan cara untuk mengklasifikasikan objek ini yang akan membantu kami mengaitkan objek berbeza dan sifatnya, seperti pensel hitam. Ia tidak boleh dibezakan (sama?) Jika digunakan dalam contoh sebelumnya, tetapi ia adalah objek yang berbeza. Tetapi kerana kedua-duanya adalah pensel, mereka tergolong dalam kelas "Pensel" yang sama. Manakala pen, yang hampir sama dengan pensel, tergolong dalam kelas yang berbeza. Walau bagaimanapun, pen dan pensel kedua-duanya adalah "Instrumen Penulisan". Pengaturcaraan berorientasikan objek mempunyai prinsip berikut:
Abstraksi
Abstraksi ditakrifkan sebagai kualiti interaksi dengan idea dan bukannya peristiwa atau, dengan kata lain, kebebasan daripada kualiti perwakilan . Ini membolehkan pengaturcara menumpukan pada perkara yang hendak diprogramkan dan bukannya cara memprogramkan . Abstraksi boleh dianggap sebagai kontrak yang melaluinya kami menyediakan fungsi. Butiran pelaksanaan mungkin disembunyikan apabila menggunakan konsep ini. Sebagai contoh, jika kita memerlukan kelas yang menulis, maka kita mesti yakin bahawa ia mempunyai kaedah "tulis". abstract class writer { write (); } Apa yang telah kita lakukan? Kami telah mereka bentuk kelas peringkat tinggi yang abstrak, dengan kata lain, ia mengetahui fungsi yang kami perlukan, tetapi cara untuk melaksanakannya adalah di luar skop kelas ini. Ini menawarkan banyak faedah:
  • Kami mendedahkan maklumat minimum yang diperlukan kepada entiti luar, ini membolehkan kami menumpukan pada pemikiran melalui program (ini membolehkan pemikiran terfokus), mengelakkan kekeliruan dan mengelakkan membuat janji yang tidak diingini.
  • Kami memberi ruang untuk penambahbaikan pada masa hadapan yang tidak mungkin dilakukan jika butiran pelaksanaan didedahkan.
Warisan
"Warisan" dalam bahasa Inggeris biasa bermaksud "untuk memperoleh dan meneruskan." Perkataan ini telah wujud dalam budaya kita sejak sekian lama. Nenek moyang memperoleh tanah melalui kerja keras dan mewariskannya kepada anak-anak mereka, malah alam memihak kepada warisan. Semua sifat badan, seperti ketinggian, warna kulit/mata/rambut, dsb. bergantung kepada gen yang kita warisi daripada ibu bapa kita. Warisan menghalang penciptaan semula roda dan mempercepatkan kemajuan. Ia sama dalam OOP. Kami mencipta kelas induk dengan beberapa sifat/tingkah laku asas. Semua kelas yang diwarisi daripada induk ini akan mengandungi sifat/tingkah laku yang sama seperti induknya. Walau bagaimanapun, kelas yang diwarisi mungkin memperoleh lebih banyak sifat/tingkah laku atau mengubah pelaksanaan tingkah laku. class WritingInstrument { colour; write() { } } class Pen (child of parent) { inkcolour; } Dalam contoh di atas, kelas induk (Instrumen Penulisan) mempunyai sifat "warna" dan tingkah laku "tulis". Apabila kelas keturunan (pemegang) diisytiharkan, sifat "warna" dan tingkah laku "tulis" tidak perlu diisytiharkan lagi. Mereka hadir dalam kelas "penangan" kerana pewarisan. Walau bagaimanapun, kelas keturunan boleh mengisytiharkan sifat/kelakuan tambahannya sendiri. Bagaimanakah kita boleh menggunakan ini dalam amalan? Kami pemaju sangat malas. Kami tidak mahu mencetak sesuatu berulang kali. Kewujudan berbilang salinan kod yang sama adalah tidak digalakkan kerana pertimbangan berikut:
  • Semakin sedikit salinan kod, semakin mudah untuk diselenggara.
  • Jika tidak terdapat banyak salinan kod, maka perubahan di satu tempat akan kelihatan di mana-mana.
  • Semakin sedikit kod, semakin sedikit ralat.
  • Jika satu kod digunakan di banyak tempat, maka generalisasi dicapai.
  • Kami memberi tumpuan kepada menulis kod.
  • Kami fokus pada ujian.
Warisan dalam Java dicapai menggunakan kata kunci "extends" dan "implements". class WritingInstrument { } class Pen extends WritingInstrument { }
Polimorfisme
Perkataan "polimorfisme" berasal daripada dua perkataan: "Poly" , i.e. “banyak” / “lebih daripada satu” “morph” , i.e. "bentuk" Secara literal, perkataan "polimorfisme" merujuk kepada keupayaan objek untuk berkelakuan dengan cara yang berbeza bergantung pada keadaan. Dalam pengaturcaraan, polimorfisme boleh dilaksanakan di beberapa tempat:
  • Kelas
  • Kaedah
  • Operator
Semua di atas mungkin berkelakuan berbeza bergantung pada keadaan, mungkin konteks, di mana ia digunakan. Ini berguna kerana pelanggan (pengaturcara yang menggunakan perpustakaan anda) tidak perlu mengetahui banyak kehalusan, dan kefungsian yang dikehendaki dilaksanakan dengan memilih maklumat yang diperlukan daripada konteks. Class WritingObject { wrire() { // пишем, используя стандартные (по дефолту) цвета } } class Pencil extends WritingObject { write() { // пишем, используя серый цвет, написанный текст можно стереть } } class Pen extends WritingObject { write() { // пишем, используя голубой цвет, написанный текст нельзя стереть } } class Main { main() { WritingObject wr = new WritingObject(); wr.write(); // первый вызов WritingObject wr = new Pen(); wr.write(); // второй вызов WritingObject wr2 = new Pencil(); wr2.write(); // третий вызов } } Contoh di atas mempunyai pelaksanaan lalai dalam WritingObject, yang dilanjutkan/ditindih oleh pen dan pen kelas terbitan. Kaedah write() dipanggil tiga kali dalam kelas Utama. Setiap kali pelaksanaan yang berbeza dipanggil bergantung pada objek mana kaedah dipanggil. Dalam kes ini, kaedah write() mempunyai banyak jenis tingkah laku kerana ia adalah polimorfik.
Enkapsulasi
Enkapsulasi ditakrifkan sebagai mengumpul data/fungsi yang berkaitan dalam satu unit. Ini membantu dalam memudahkan capaian/pengubahsuaian data. Sebagai contoh, jika kita perlu mencetak semua sifat yang dimiliki oleh pengguna tertentu, kita mempunyai pilihan berikut: printUserProperties(userName, userId, firstname, lastname, email, phone, … … ….) Kami mencipta kaedah yang mengambil semua sifat dan mencetaknya satu demi satu. Apabila bilangan elemen dalam senarai bertambah, ia tidak lagi dapat mengenal pasti medan yang betul dan menambah/mengalih keluar satu medan akan mengubah tandatangan kaedah. Oleh itu, kami perlu menggantikan semua pengguna kaedah ini, walaupun mereka tidak memerlukan medan yang ditambah baru-baru ini. Untuk menjadikan kod lebih mudah dibaca dan memudahkan pengubahsuaian masa hadapan, kami merangkum sifat dalam kelas dan mengubahnya menjadi objek kolektif. class User { userName userId firstname lastname email phone .. .. .. } printUserProperties(user) {} Objek ialah himpunan perisian pembolehubah dan kaedah yang berkaitan. Anda boleh mewakili objek dunia sebenar menggunakan objek program. Anda boleh bayangkan anjing sebenar dalam program animasi, atau basikal sebenar sebagai objek perisian di dalam basikal senaman. Dalam OOP, kelas ialah templat yang boleh diperluaskan (templat kod-program) untuk mencipta objek, menyediakannya dengan keadaan awal (pembolehubah) dan melaksanakan tingkah laku (fungsi, kaedah). Akronim SOLID dicipta oleh Michael Feather untuk "lima prinsip pertama" yang dinamakan oleh Robert C. Martin pada awal 2000-an. Matlamat prinsip, apabila dilaksanakan bersama, adalah untuk meningkatkan kemungkinan bahawa pengaturcara akan mencipta sistem yang mudah diselenggara dan dilanjutkan. Prinsip SOLID ialah garis panduan dalam pembangunan program yang diperlukan untuk mengalih keluar kod "busuk" melalui pemfaktoran semula, akibatnya kod itu harus mudah dibaca dan diperluaskan. Ini adalah sebahagian daripada strategi pengaturcaraan tangkas dan adaptif.
Prinsip Tanggungjawab Tunggal
Dalam OOP, prinsip tanggungjawab tunggal menyatakan bahawa setiap kelas harus bertanggungjawab untuk satu bahagian fungsi yang disediakan oleh program, dan tanggungjawab itu harus dirangkum sepenuhnya oleh kelas tersebut. Semua fungsinya harus berkait rapat dengan tanggungjawab ini.
Prinsip Terbuka/Tertutup
Dalam OOP, prinsip terbuka/tertutup menyatakan bahawa "entiti perisian (kelas, modul, kaedah, dll.) harus terbuka kepada sambungan tetapi ditutup untuk berubah." Dalam erti kata lain, entiti mesti membenarkan tingkah lakunya dilanjutkan tanpa mengubah kod sumber.
Prinsip Penggantian Liskov
Kebolehgantian ialah prinsip dalam OOP. Ia menyatakan bahawa jika S dalam atur cara komputer ialah subjenis T, maka objek jenis T mestilah sedemikian rupa sehingga ia boleh digantikan dengan objek jenis S (iaitu objek jenis S boleh digantikan dengan objek jenis T) tanpa mengubah sebarang program sifat yang diperlukan (ketepatan, penyiapan tugas, dsb.).
Prinsip Pengasingan Antara Muka
Prinsip pemisahan antara muka menyatakan bahawa pengaturcara klien tidak boleh dipaksa untuk bergantung pada kaedah yang tidak digunakan. Menurut prinsip ini, adalah perlu untuk membahagikan antara muka yang besar kepada yang lebih kecil dan lebih spesifik supaya pengaturcara klien hanya mengetahui kaedah yang menarik baginya. Tujuan prinsip penyahgandingan antara muka adalah untuk memastikan sistem dipisahkan, yang akan memudahkan pemfaktoran semula, membuat perubahan dan menggunakan semula.
Prinsip Inversi Ketergantungan
Dalam OOP, prinsip penyongsangan kebergantungan bermaksud bentuk pemutusan sambungan modul program tertentu. Dengan mengikut prinsip ini, perhubungan pergantungan standard yang diwujudkan daripada modul peringkat tinggi yang membentuk seni bina aplikasi (penetapan dasar) kepada modul peringkat rendah bergantung disongsangkan (terbalik), supaya modul peringkat tinggi yang diubah suai menjadi bebas daripada butiran pelaksanaan modul peringkat rendah. Prinsip ini menyatakan:
  • Modul tahap tinggi tidak boleh bergantung pada modul tahap rendah. Kedua-dua jenis modul mesti bergantung pada abstraksi.
  • Abstraksi tidak boleh bergantung pada butiran pelaksanaan. Butiran mesti bergantung pada abstraksi.
Prinsip ini membalikkan cara orang boleh berfikir tentang reka bentuk berorientasikan objek dengan berhujah bahawa objek peringkat tinggi dan rendah harus bergantung pada abstraksi yang sama.

prinsip GRASP

Corak Perisian Tugasan Tanggungjawab Am (GRASP) menyediakan garis panduan untuk memberikan tanggungjawab kepada kelas dan objek dalam reka bentuk berorientasikan objek.
Pengawal
Corak Pengawal memberikan tanggungjawab untuk berinteraksi dengan peristiwa sistem kepada kelas bukan GUI yang mewakili keseluruhan sistem atau senario kes penggunaan. Pengawal:
  • Ini ialah objek yang tidak berinteraksi secara langsung dengan pengguna dan bertanggungjawab untuk menerima dan bertindak balas kepada peristiwa sistem.
  • Mesti digunakan untuk menangani semua peristiwa sistem bagi satu (atau banyak kes penggunaan yang saling berkaitan).
  • Ia adalah objek pertama di sebalik GUI yang mengawal operasi sistem.
  • Dia tidak perlu melakukan kerja itu sendiri; tugasnya adalah untuk mengawal aliran peristiwa.
Pencipta
Tugas kelas pencipta adalah untuk mencipta dan memulakan objek untuk kegunaan seterusnya. Ia mengetahui parameter permulaan, serta objek yang akan dibuat. Kadangkala kelas pencipta secara aktif mencipta objek dan meletakkannya dalam cache, dan menyediakan satu contoh apabila ia diperlukan.
Kesepaduan Tinggi
Kohesi tinggi ialah corak penilaian, tujuannya adalah untuk mengekalkan objek dalam keadaan sedemikian yang bertujuan untuk melaksanakan satu tugas yang jelas, mudah dikawal dan difahami. Gandingan Tinggi biasanya digunakan untuk menyokong Gandingan Rendah. Kesepaduan yang tinggi bermaksud bahawa tanggungjawab elemen tertentu ditakrifkan dengan jelas (sangat berkaitan dan sangat fokus). Membahagikan atur cara kepada kelas dan subsistem ialah contoh tindakan yang meningkatkan kohesi sifat sistem. Gandingan longgar, sebaliknya, adalah situasi di mana elemen mempunyai terlalu banyak tugas yang tidak berkaitan. Elemen yang digandingkan secara longgar cenderung sukar difahami, boleh diguna semula, sukar diselenggara dan sukar diubah.
tidak arah
Corak Bulatan mengekalkan gandingan longgar (dan kebolehgunaan semula) antara dua elemen dengan memberikan tanggungjawab untuk interaksi antara mereka kepada objek perantaraan. Contohnya ialah pengenalan pengawal untuk menjadi pengantara antara data (model) dan paparannya (pandangan) dalam corak Model-View-Controller (MVC).
Pakar Maklumat
Pakar Maklumat (juga Pakar atau Prinsip Pakar) ialah prinsip yang digunakan untuk menentukan kepada siapa untuk mewakilkan tanggungjawab. Tanggungjawab termasuk kaedah, medan yang dikira, dsb. Apabila menggunakan prinsip ini semasa memberikan tanggungjawab, pendekatan utama ialah urutan tindakan berikut: menganalisis tanggungjawab, mengenal pasti maklumat yang diperlukan untuk memenuhinya, dan akhirnya menentukan lokasi maklumat ini. Menggunakan prinsip Pakar Maklumat menghasilkan tanggungjawab kepada kelas yang mempunyai maklumat terbanyak untuk melaksanakannya.
Gandingan Rendah
Gandingan longgar ialah corak penilaian yang menentukan cara menetapkan tanggungjawab: gandingan longgar antara kelas, menukar satu harus memberi impak minimum pada yang lain, memaksimumkan kebolehgunaan semula.
Polimorfisme
Menurut polimorfisme, variasi tingkah laku berdasarkan jenis diberikan kepada jenis yang variasi ini berlaku. Ini dicapai dengan menggunakan operasi polimorfik.
Variasi Dilindungi
Corak Perubahan Dilindungi melindungi elemen daripada perubahan kepada elemen lain (objek, sistem, subsistem) dengan membungkus fokus ketidakstabilan dalam antara muka dan menggunakan polimorfisme untuk mencipta pelaksanaan berbeza antara muka tersebut.
Fabrikasi Tulen
Pembinaan tulen melibatkan kelas yang tidak mewakili konsep dalam domain masalah dan direka khusus untuk mencapai gandingan longgar, kohesi tinggi, dan oleh itu potensi penggunaan semula maksimum (penyelesaian yang ditawarkan oleh corak Pakar Maklumat tidak mencapai ini). Kelas sedemikian biasanya dipanggil "Perkhidmatan" dalam reka bentuk dipacu Domain.

Kritikan

Penyelidikan oleh Potok et al menunjukkan tiada perbezaan yang signifikan antara OOP dan pendekatan prosedur.
Perbandingan kritikal OOP dengan teknologi lain, terutamanya teknologi perhubungan, adalah sukar kerana kekurangan definisi OOP yang ketat dan diterima secara meluas (Christopher J. Date)
Berbanding dengan bahasa lain (dialek LISP, bahasa berfungsi, dll.), Bahasa OOP tidak mempunyai kelebihan unik dan mengenakan kerumitan yang tidak perlu. (Lawrence Krubner)
Saya mendapati pengaturcaraan berorientasikan objek secara teknikalnya tipis. Ia cuba menguraikan dunia kepada bahagian-bahagian dari segi antara muka yang berbeza-beza dalam satu jenis. Untuk menangani masalah sebenar, anda memerlukan algebra berbilang - keluarga antara muka yang merentasi pelbagai jenis. Saya mendapati pengaturcaraan berorientasikan objek secara falsafah tidak sihat. Ia menyatakan bahawa segala-galanya adalah objek. Walaupun ini benar, ia tidak begitu menarik: untuk mengatakan bahawa segala-galanya adalah objek adalah untuk mengatakan apa-apa sama sekali. (Alexander Stepanov)
Populariti OOP di kalangan syarikat besar adalah disebabkan oleh "kumpulan besar (dan sering berubah) pengaturcara biasa." Disiplin yang dikenakan oleh OOP menghalang pengaturcara daripada melakukan "terlalu banyak bahaya." (Paul Graham)
Pengaturcaraan berorientasikan objek meletakkan kata nama pertama dan terpenting. Mengapa pergi ke langkah yang melampau dan meletakkan satu bahagian ucapan di atas alas? Mengapakah satu konsep diutamakan daripada yang lain? Adalah mustahil untuk OOP tiba-tiba menjadikan kata kerja kurang penting kepada pemikiran kita. Ini adalah perspektif yang aneh. (Steve Yegge)
Rick Hickey, pencipta Clojure, menyifatkan sistem objek sebagai model dunia nyata yang sangat mudah. Beliau menekankan ketidakupayaan OOP untuk memodelkan masa dengan betul, yang menimbulkan masalah besar apabila multithreading menjadi perkara biasa dalam program. Eric S. Raymond, pengaturcara Unix dan penyokong perisian sumber terbuka, telah mengkritik dakwaan bahawa OOP ialah "The One Solution" dan telah menulis bahawa OOP menggalakkan program berbilang lapisan, yang menghalang ketelusan. Sebagai pendekatan yang bertentangan, Raymond memberikan contoh Unix dan C.

Pautan

Oleh Margaret Rouse @ WhatIs.com Wikipedia! ( Versi Rusia ) warisan adalah polimorfisme SOLID (Reka Bentuk Berorientasikan Objek) ( Versi Rusia ) Prinsip Tanggungjawab TunggalArgumen terhadap OOPS ( versi Rusia ) Apakah itu OOPS (tanpa gembar-gembur) Terjemahan: Varygin D.V.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION