Pemrograman terstruktur versus pemrograman OO

11

Saya membuat presentasi yang menunjukkan perbedaan antara pemrograman struktural dan berorientasi objek dan saya ingin menggambarkan mengapa orang membutuhkan OOP dengan contoh di mana menerapkan konsep OOP akan membuat pengkodean lebih mudah sehingga penonton benar-benar merasa bahwa mereka membutuhkan OOP.

Ada Ide ??

Ahmed
sumber
2
menanyakan pertanyaan ini di programmer.stackexchange.com akan memberi Anda lebih banyak jawaban.
Reggie
2
Apa audiens Anda? Pemrogram non-OO berpengalaman (cobol, dll)? programmer yang kurang berpengalaman (siswa, dll)? Eksekutif (bukan programmer sama sekali)?
Saya tidak mendengar tentang itu sebelumnya tetapi saya membaca FAQ dan saya kira lebih baik untuk bertanya di sana.
Ahmed
rendah berpengalaman.
Ahmed
4
Saya berharap beberapa program OO terstruktur lebih baik.
Scott Whitlock

Jawaban:

17

Anda mungkin ingin melihat blog video cepat ini . Hasilnya adalah bahwa perbedaan antara pemrograman terstruktur dan pemrograman OO adalah masalah apa yang mereka ambil dari pemrograman, bukan tentang apa yang mereka tambahkan. Disiplin perangkat lunak seperti Pemrograman Terstruktur dan Pemrograman Berorientasi Objek membatasi, tidak memungkinkan. Berikut ini beberapa definisi. Peringatan: Anda tidak akan menyukainya.

  • Pemrograman terstruktur adalah disiplin yang diterapkan pada goto (transfer kontrol langsung)

  • Pemrograman OO adalah disiplin yang dikenakan pada pointer ke fungsi (transfer kontrol tidak langsung)

  • Pemrograman fungsional adalah disiplin yang dikenakan pada penugasan.

    Yang pertama tidak terlalu sulit untuk dipahami. Dijkstra menemukan bahwa tidak mungkin untuk membuat bukti umum kebenaran ketika goto diizinkan dalam algoritma. Namun jika struktur kontrol terbatas pada urutan, seleksi, dan iterasi, maka bukti-bukti kebenaran yang mungkin. Tentu saja kami bahkan tidak mencoba untuk membuktikan hal-hal yang benar saat ini, tetapi kami menyukai kesederhanaan dan keanggunan pemrograman terstruktur.

Agak sulit untuk memahami OO. Kita sering mendefinisikan OO sebagai enkapsulasi, pewarisan, dan polimorfisme. Apa yang kurang tahu adalah bahwa ketiga atribut ini dapat dicapai, dan sering yang dicapai dalam C. Memang, C ++ dimulai sebagai hanya preprocessor yang dikompilasi ke C. Ini tidak benar-benar sulit untuk merangkum di C. Juga sulit untuk membangun struktur data yang merupakan himpunan bagian dari satu sama lain, mensimulasikan pewarisan. Namun, polimorfisme sedikit lebih sulit. Ini membutuhkan pointer ke fungsi yang, dalam C, sulit untuk dikelola dengan baik. Apa yang diberikan oleh bahasa seperti C ++ kepada kami adalah disiplin yang dikenakan pada pointer-pointer itu pada fungsi. Kompiler C ++ membangun vtables untuk kita, dan menginisialisasi pointer di dalamnya sesuai dengan formalisme yang ketat. Jadi, dalam arti yang sangat nyata, OO hanyalah disiplin yang dikenakantransfer kontrol tidak langsung yaitu pointer ke fungsi.

Pemrograman terstruktur adalah tentang bagaimana tidak menggunakan goto. OO adalah tentang bagaimana tidak menggunakan pointer ke fungsi. Dan pemrograman fungsional juga adalah semua tentang apa yang tidak boleh dilakukan. Dalam pemrograman fungsional kami tidak menetapkan variabel kecuali dalam kasus-kasus yang paling ketat dikendalikan.

Jadi pada akhirnya, semua "teknologi" Pemrograman ini sebenarnya membatasi disiplin ilmu daripada mengaktifkan teknologi. Mereka memberi tahu kami apa yang tidak boleh dilakukan lebih dari apa yang harus kami lakukan. Dan itu berarti pengembangan perangkat lunak belum berkembang selama 40 tahun terakhir. Sebaliknya, ia menyusut. Itu menjadi semakin terbatas karena kita telah mempelajari semua hal yang seharusnya tidak kita lakukan.

Mempelajari apa yang tidak boleh dilakukan adalah baik; tetapi inilah pertanyaan yang mengganggu: hal-hal baru apa yang telah kita pelajari untuk lakukan?

Paman Bob.
sumber
@Ahmed: +1 untuk "TL; DR, terima kasih untuk Video" -Komentar mencurigakan (bercanda)
n611x007
tautan busuk ... tautan mati
slashdottir
7

Ada 3 cara dasar untuk memprogram komputer:

  1. Pemrograman tidak terstruktur - dengan gotos, seperti pada penerjemah BASIC lama, atau dalam bahasa assembly. Tidak banyak orang yang memprogram dengan cara ini lagi.
  2. Pemrograman imperatif terstruktur - seperti dalam C, atau PASCAL.
  3. Pemrograman fungsional terstruktur - seperti di Haskell, ML, atau Lisp.

Dalam pandangan saya, pemrograman berorientasi objek adalah sesuatu yang berbeda. Ini tentang bagaimana mengatur program Anda pada skala yang lebih besar. Itu tidak menggantikan atau meniadakan salah satu dari 3 paradigma yang saya sebutkan di atas - dalam sebuah metode, Anda masih perlu memilih salah satu dari 3 paradigma dari daftar untuk menulis.

Ken Bloom
sumber
Saya tidak mengerti Anda dengan baik! Maksudmu kita harus menggunakan salah satu dari 3 paradigma tapi KAMI tidak tahu .. dan OOP hanya tentang lebih banyak organisasi ??
Ahmed
Anda tidak dapat memprogram tanpa mempelajari pemrograman imperatif terstruktur atau pemrograman fungsional terstruktur. Kedua paradigma itu adalah tentang menyelesaikan sesuatu. OOP, di sisi lain, adalah tentang modularisasi program yang hanya berlaku setelah program Anda mencapai ukuran tertentu. Meskipun pasti muncul di perpustakaan yang Anda gunakan saat pemrograman sepanjang waktu, orang dapat memiliki perpustakaan kelas yang sangat baik tanpa fitur OO seperti warisan, misalnya perpustakaan kelas Haskell, LISP, atau Standard ML.
Ken Bloom
4

Ini semua tentang bagaimana Anda mengantisipasi perubahan.

Kedua konsep memungkinkan untuk reusablility, tetapi OOP membuka pintu untuk perubahan yang lebih mudah. OOP memiliki semua usabilitas yang dilakukan pemrograman Struktural, tetapi Anda juga dapat menggunakannya untuk membuat fungsionalitas baru dengan sedikit usaha.

Anda bisa mengatakan bahwa OOP mewarisi semua fungsi Pemrograman Struktural dengan fungsionalitas tambahan warisan! :-D

corsiKa
sumber
Saya tidak terlalu menyukai warisan saat ini.
4
Saya juga tidak, tetapi itu karena pemerintah mencabut kakek saya dari pensiunnya. Namun, dalam hal OOP, warisan telah membantu saya dengan baik!
corsiKa
Dalam pengalaman saya, pewarisan sebaiknya dihindari di OOP. Seberapa sering Anda benar-benar membangun superclass sebagai lawan dari Interface? Mendukung komposisi sebagai aturan umum.
Janx
1
@Janx: "Seberapa sering Anda benar-benar membangun superclass sebagai lawan dari Interface?" Hah? Anda tidak "membuat kacamata super"; Anda mengambil kelas yang ada dan membangun subclasss dari mereka, dan Anda bahwa sepanjang waktu. Jika Anda tidak menggunakan warisan, Anda tidak mendapatkan manfaat dari substitusi dan polimorfisme Liskov, jadi apa yang Anda lakukan dalam pemrograman berorientasi objek? Komposisi adalah alat yang berbeda dengan use case yang berbeda, bukan pengganti untuk warisan. Anda seharusnya tidak "memihak" satu di atas yang lain; Anda harus menggunakan keduanya, masing-masing untuk apa manfaatnya.
Mason Wheeler
1
@Mason - perlu dicatat bahwa Barbara Liskov (dari Prinsip Pergantian Liskov) benar-benar mengatakan (video panjang) dia tidak terlalu suka warisan.
Aidan Cully
2

Konsepnya ortogonal. Pemrograman terstruktur adalah tentang kode penataan dalam prosedur / fungsi / metode. Sangat mungkin (dan diinginkan) untuk mengikuti prinsip-prinsip pemrograman terstruktur dalam metode kelas ketika melakukan OOP.

Nemanja Trifunovic
sumber
1

Itu semacam kata-kata subjektif - pemrograman terstruktur dan OOP adalah gaya pemecahan masalah, dan yang satu tidak selalu lebih baik dari yang lain. Menulis pustaka metode numerik cukup masuk akal jika dilakukan dengan gaya terstruktur, tempat Anda melakukan transformasi pada input data. Agen sederhana yang digerakkan oleh mesin negara, dapat dengan mudah dinyatakan sebagai kelas mandiri di Java atau C ++. OOP dapat menjadi cara alami mengekspresikan wadah penyimpanan untuk struktur data.

Berbicara tentang penyembunyian informasi dan modularitas adalah cara yang baik untuk secara alami memotivasi OOP sebagai gaya.

Pandangan yang menarik tentang masalah ini ditulis oleh Steve Yegge - dalam beberapa hal, salah satu deskripsi yang lebih baik dari perbedaan pendekatan antara kedua gaya.

pengguna18014
sumber
0

OOP lebih mudah dipahami ketika Anda membuat model bisnis. Ketika Anda berpikir tentang elemen-elemen aplikasi, Anda menggunakan beberapa OBYEK dan HUBUNGAN di antara mereka misalnya Buku memiliki Penulis, Judul, ISBN. Buku adalah untuk membiarkan di Perpustakaan dan dapat dipinjam oleh Siswa Pemrograman struktural memaksakan pemikiran tentang proses spesifik, implementasi tidak dalam abstraksi.

OOP dirancang untuk memudahkan perubahan. Perubahan dalam program struktural dimungkinkan tetapi harus dijelaskan dengan kode. Perubahan dalam program OO dapat dijelaskan dengan perubahan model abstrak.


sumber
0

Lingkup variabel:

Saya pikir prinsip bahasa untuk memastikan pemrograman yang baik adalah membatasi ruang lingkup variabel. Dalam bahasa terstruktur seperti C, ruang lingkup terutama dari dua jenis -

  • Ruang lingkup global
  • Lingkup Lokal / Fungsi / Metode

Kita semua tahu ruang lingkup global berbahaya. Tetapi terkadang lingkup lokal tidak cukup untuk menjalankan program. Menghindari cakupan global maka cenderung menggunakan pointer lebih luas, yang memungkinkan penggunaan variabel di luar lingkup. Tetapi pointer sulit dipahami dan digunakan.

Bahasa OOP seperti C ++ menambahkan tipe baru dari scope- Class / Object scope melalui enkapsulasi. Pelingkupan ini semakin ditingkatkan oleh variasi pribadi / publik. Dan ini memecahkan banyak masalah pelingkupan variabel. Lingkup lebih didefinisikan dalam OOP. Dan pointer kurang dibutuhkan.

Ini adalah salah satu fitur hebat dari OOP.

Gulshan
sumber