Bagaimana menjelaskan konsep pemrograman berorientasi objek kepada anak berusia 6 tahun

Pernahkah Anda memperhatikan bagaimana pertanyaan klise yang sama selalu diajukan saat wawancara kerja - berulang kali?

Saya yakin Anda tahu apa yang saya maksud.

Sebagai contoh:

Di mana Anda melihat diri Anda dalam lima tahun?

atau, lebih buruk lagi:

Apa yang Anda anggap sebagai kelemahan terbesar Anda?

Ugh… beri aku istirahat. Saya menganggap menjawab pertanyaan ini sebagai kelemahan besar! Bagaimanapun, bukan maksud saya.

Pertanyaan-pertanyaan seperti ini mungkin sepele, tetapi itu penting karena memberi petunjuk tentang Anda. Keadaan pikiran Anda saat ini, sikap Anda, perspektif Anda.

Saat menjawab, Anda harus berhati-hati, karena Anda mungkin akan mengungkapkan sesuatu yang kemudian Anda sesali.

Hari ini saya ingin berbicara tentang jenis pertanyaan serupa di dunia pemrograman:

Apa prinsip utama Pemrograman Berorientasi Objek?

Saya berada di kedua sisi pertanyaan ini. Itu salah satu topik yang begitu sering ditanyakan sehingga Anda tidak bisa membiarkan diri Anda tidak tahu.

Developer junior dan entry level biasanya harus menjawabnya. Karena itu cara mudah pewawancara untuk mengatakan tiga hal:

  1. Apakah kandidat mempersiapkan wawancara ini?

    Poin bonus jika Anda mendengar jawaban segera - ini menunjukkan pendekatan yang serius.

  2. Apakah kandidat sudah melewati tahap tutorial?

    Memahami prinsip-prinsip Pemrograman Berorientasi Objek (OOP) menunjukkan bahwa Anda telah melampaui menyalin dan menempel dari tutorial - Anda sudah melihat sesuatu dari perspektif yang lebih tinggi.

  3. Apakah pemahaman kandidat dalam atau dangkal?

    Tingkat kompetensi pada pertanyaan ini seringkali sama dengan tingkat kompetensi pada sebagian besar mata pelajaran lainnya . Percayalah kepadaku.

Empat prinsip pemrograman berorientasi objek adalah enkapsulasi , abstraksi , pewarisan ,dan polimorfisme .

Kata-kata ini mungkin terdengar menakutkan bagi developer junior. Dan penjelasan yang rumit dan sangat panjang di Wikipedia terkadang membuat kebingungan berlipat ganda.

Karena itulah saya ingin memberikan penjelasan yang sederhana, singkat, dan jelas untuk masing-masing konsep tersebut. Ini mungkin terdengar seperti sesuatu yang Anda jelaskan kepada seorang anak, tetapi saya benar-benar ingin mendengar jawaban ini ketika saya melakukan wawancara.

Enkapsulasi

Katakanlah kita punya program. Ini memiliki beberapa objek yang berbeda secara logis yang berkomunikasi satu sama lain - sesuai dengan aturan yang ditentukan dalam program.

Enkapsulasi dicapai ketika setiap objek menjaga statusnya tetap privat , di dalam kelas. Objek lain tidak memiliki akses langsung ke status ini. Sebaliknya, mereka hanya dapat memanggil daftar fungsi publik - yang disebut metode.

Jadi, objek mengelola statusnya sendiri melalui metode - dan tidak ada kelas lain yang dapat menyentuhnya kecuali diizinkan secara eksplisit. Jika Anda ingin berkomunikasi dengan objek tersebut, Anda harus menggunakan metode yang disediakan. Tetapi (secara default), Anda tidak dapat mengubah status.

Katakanlah kita sedang membangun game Sims kecil. Ada orang dan ada kucing. Mereka berkomunikasi satu sama lain. Kami ingin menerapkan enkapsulasi, jadi kami merangkum semua logika "kucing" ke dalam aCatkelas. Ini mungkin terlihat seperti ini:

Di sini "status" kucing adalah variabel privatmood , hungrydan energy. Ini juga memiliki metode pribadi meow(). Ia dapat memanggilnya kapan pun ia mau, kelas lain tidak dapat memberi tahu kucing kapan harus mengeong.

Apa yang dapat mereka lakukan didefinisikan dalam metode publiksleep() , play()dan feed(). Masing-masing memodifikasi keadaan internal entah bagaimana dan dapat memanggil meow(). Dengan demikian, pengikatan antara private state dan metode publik dibuat.

Ini adalah enkapsulasi.

Abstraksi

Abstraksi dapat dianggap sebagai perpanjangan alami dari enkapsulasi.

Dalam desain berorientasi objek, program seringkali berukuran sangat besar. Dan objek yang terpisah sering berkomunikasi satu sama lain. Jadi, mempertahankan basis kode besar seperti ini selama bertahun-tahun - dengan perubahan sepanjang proses - itu sulit.

Abstraksi adalah konsep yang bertujuan untuk meredakan masalah ini.

Menerapkan abstraksi berarti bahwa setiap objek hanya boleh mengekspos mekanisme tingkat tinggi untuk menggunakannya.

Mekanisme ini harus menyembunyikan detail implementasi internal. Ini seharusnya hanya mengungkapkan operasi yang relevan untuk objek lain.

Pikirkan - mesin kopi. Itu melakukan banyak hal dan membuat suara-suara unik di bawah kap mesin. Tetapi yang harus Anda lakukan hanyalah memasukkan kopi dan menekan tombol.

Lebih disukai, mekanisme ini harus mudah digunakan dan jarang berubah seiring waktu. Anggap saja sebagai sekumpulan kecil metode publik yang dapat dipanggil oleh kelas lain tanpa “mengetahui” cara kerjanya.

Contoh abstraksi kehidupan nyata lainnya?

Pikirkan tentang cara Anda menggunakan ponsel:

Anda berinteraksi dengan telepon Anda hanya dengan menggunakan beberapa tombol. Apa yang terjadi di bawah tenda? Anda tidak perlu tahu - detail implementasi disembunyikan. Anda hanya perlu mengetahui serangkaian tindakan singkat.

Perubahan implementasi - misalnya, pembaruan perangkat lunak - jarang mempengaruhi abstraksi yang Anda gunakan.

Warisan

Oke, kami melihat bagaimana enkapsulasi dan abstraksi dapat membantu kami mengembangkan dan mempertahankan basis kode yang besar.

Tapi tahukah Anda apa masalah umum lainnya dalam desain OOP?

Objek seringkali sangat mirip. Mereka berbagi logika yang sama. Tapi mereka tidak sepenuhnya sama. Ugh…

Jadi, bagaimana kita menggunakan kembali logika umum dan mengekstrak logika unik ke dalam kelas terpisah? Salah satu cara untuk mencapai ini adalah warisan.

Ini berarti Anda membuat kelas (anak) dengan mengambil dari kelas (induk) lain. Dengan cara ini, kami membentuk hierarki.

Kelas anak menggunakan kembali semua bidang dan metode kelas induk (bagian umum) dan dapat mengimplementasikannya sendiri (bagian unik).

Sebagai contoh:

Jika program kami perlu mengelola guru negeri dan swasta, tetapi juga tipe orang lain seperti siswa, kami dapat menerapkan hierarki kelas ini.

Dengan cara ini, setiap kelas hanya menambahkan yang diperlukan untuk itu sambil menggunakan kembali logika umum dengan kelas induk.

Polimorfisme

Kita sampai pada kata yang paling rumit! Polimorfisme berarti "banyak bentuk" dalam bahasa Yunani.

Jadi kita sudah mengetahui kekuatan warisan dan dengan senang hati menggunakannya. Tapi ada masalah ini.

Katakanlah kita memiliki kelas induk dan beberapa kelas anak yang mewarisi darinya. Terkadang kami ingin menggunakan koleksi - misalnya daftar - yang berisi campuran dari semua kelas ini. Atau kami memiliki metode yang diimplementasikan untuk kelas induk - tetapi kami ingin menggunakannya juga untuk anak-anak.

Ini dapat diselesaikan dengan menggunakan polimorfisme.

Sederhananya, polimorfisme memberikan cara untuk menggunakan kelas persis seperti induknya sehingga tidak ada kebingungan dengan jenis pencampuran.Tetapi setiap kelas anak mempertahankan metodenya sendiri sebagaimana adanya.

Ini biasanya terjadi dengan menentukan antarmuka (induk) untuk digunakan kembali. Ini menguraikan banyak metode umum. Kemudian, setiap kelas anak mengimplementasikan versinya sendiri dari metode ini.

Setiap kali kumpulan (seperti daftar) atau metode mengharapkan turunan dari induknya (di mana metode umum diuraikan), bahasa akan mengevaluasi penerapan yang benar dari metode umum - terlepas dari anak mana yang diteruskan.

Lihatlah sketsa implementasi figur geometris. Mereka menggunakan kembali antarmuka umum untuk menghitung luas permukaan dan keliling:

Memiliki tiga angka ini mewarisi orang tua Figure Interfacememungkinkan Anda membuat daftar campuran triangles, circlesdan rectangles. Dan perlakukan mereka seperti jenis objek yang sama.

Kemudian, jika daftar ini mencoba menghitung permukaan elemen, metode yang benar ditemukan dan dijalankan. Jika elemennya segitiga, berarti segitigaCalculateSurface()disebut. Jika itu lingkaran - maka lingkaran ituCalculateSurface()disebut. Dan seterusnya.

Jika Anda memiliki fungsi yang beroperasi dengan sebuah gambar dengan menggunakan parameternya, Anda tidak harus mendefinisikannya tiga kali - sekali untuk segitiga, lingkaran, dan persegi panjang.

Anda dapat mendefinisikannya sekali dan menerima a Figuresebagai argumen. Apakah Anda mengoper segitiga, lingkaran, atau persegi panjang - selama diterapkan CalculateParamter(), jenisnya tidak masalah.

Saya harap ini membantu. Anda dapat langsung menggunakan penjelasan yang sama persis di wawancara kerja.

Jika Anda menemukan sesuatu yang masih sulit dipahami - jangan ragu untuk bertanya di komentar di bawah.

Apa berikutnya?

Bersiap untuk menjawab salah satu pertanyaan klasik pertanyaan wawancara sepanjang masa itu bagus - tetapi terkadang Anda tidak pernah dipanggil untuk wawancara.

Selanjutnya, saya akan fokus pada apa yang ingin dilihat oleh pemberi kerja pada developer junior dan cara menonjol dari kerumunan saat mencari pekerjaan.

Tetap disini.