Results (
Indonesian) 2:
[Copy]Copied!
1
The Ketergantungan Inversi
Prinsip
ini adalah ketiga saya Teknik Notebookcolumns untuk The C ++ Report. Artikel-artikel
yang akan muncul di kolom ini akan fokus pada penggunaan C ++ dan OOD, dan akan membahas
isu-isu rekayasa perangkat lunak. Saya akan berusaha untuk
artikel yang pragmatis
dan langsung berguna untuk
insinyur perangkat lunak dalam
parit. Dalam artikel ini saya
akan memanfaatkan Booch ini
unifiednotation baru dan Rumbaugh ini (Version 0.8)
untuk mendokumentasikan berorientasi objek desain. Sidebar
menyediakan leksikon singkat
notasi ini.
Pengenalan
saya artikel terakhir (Mar, 96) berbicara tentang Liskov Pergantian Prinsip (LSP). Prinsip ini, bila diterapkan pada C ++, memberikan panduan untuk penggunaan warisan publik. Ini menyatakan bahwa
setiap fungsi yang beroperasi pada referensi atau pointer ke kelas dasar, harus dapat
beroperasi pada turunan dari kelas dasar tanpa menyadarinya. Ini berarti bahwa virtual
fungsi anggota dari kelas turunan harus mengharapkan tidak lebih dari anggota yang sesuai
fungsi dari kelas dasar; dan harus berjanji tidak kurang. Ini juga berarti bahwa anggota maya
fungsi yang hadir di kelas dasar juga harus hadir di kelas turunan; dan
mereka harus melakukan pekerjaan yang bermanfaat. Ketika prinsip ini dilanggar, fungsi yang beroperasi pada
pointer atau referensi untuk kelas dasar akan perlu memeriksa jenis objek yang sebenarnya untuk
memastikan bahwa mereka dapat beroperasi atasnya benar. Kebutuhan ini untuk memeriksa jenis melanggar
Open-Tertutup Prinsip (OCP) yang kita bahas Januari lalu.
Dalam kolom ini, kita membahas implikasi struktural dari OCP dan LSP. The
struktur yang dihasilkan dari penggunaan ketat dari prinsip-prinsip ini dapat digeneralisasi menjadi prinsip dengan sendirinya. Saya menyebutnya "The Dependency Pembalikan Prinsip" (DIP).
Sidebar: Bersatu Notasi 0.8
Base Class
Berasal 1 Berasal 2
Telah oleh
Referensi
Memiliki By Nilai
Digunakan? 2 Apa yang salah dengan perangkat lunak? Apa yang salah dengan software Sebagian besar dari kita telah memiliki pengalaman tidak menyenangkan mencoba untuk berurusan dengan software yang memiliki "desain yang buruk". Sebagian dari kita bahkan telah memiliki pengalaman lebih menyenangkan dari menemukan bahwa kita adalah penulis dari perangkat lunak dengan "desain yang buruk". Apa itu yang membuat sebuah desain yang buruk? Kebanyakan insinyur perangkat lunak tidak berangkat untuk membuat "desain yang buruk". Namun sebagian besar perangkat lunak akhirnya degradasi ke titik di mana seseorang akan mendeklarasikan desain menjadi tidak sehat. Mengapa hal ini terjadi? Apakah desain miskin untuk memulai dengan, atau apakah desain benar-benar menurunkan seperti sepotong daging busuk? Di jantung masalah ini adalah kurangnya dari kerja yang baik definisi "buruk" desain. Definisi dari "Desain Bad" Apakah Anda pernah disajikan desain software, bahwa Anda sangat bangga, untuk ditinjau oleh rekan? Apakah rekan yang mengatakan, dalam seringai mengejek merengek, sesuatu seperti: "Mengapa kau melakukannya thatway?". Tentu saja ini telah terjadi kepada saya, dan saya telah melihat hal itu terjadi pada banyak lainnya insinyur juga. Jelas insinyur setuju tidak menggunakan kriteria yang sama untuk mendefinisikan apa "desain yang buruk" adalah. Kriteria yang paling umum yang saya telah melihat digunakan adalah TNTWIWHDI atau "Itu bukan cara saya akan melakukannya" kriteria. Tapi ada satu set kriteria yang saya pikir semua insinyur akan setuju dengan. Sepotong perangkat lunak yang memenuhi persyaratan dan belum menunjukkan salah satu atau semua dari tiga berikut ciri-ciri memiliki desain yang buruk. 1. Sulit untuk berubah karena setiap perubahan mempengaruhi terlalu banyak bagian lain dari sistem. (Kekakuan) 2. Ketika Anda membuat perubahan, bagian tak terduga dari sistem istirahat. (Kerapuhan) 3. Sulit untuk menggunakan kembali dalam aplikasi lain karena tidak dapat mengurai dari aplikasi saat ini. (Imobilitas) Selain itu, akan sulit untuk menunjukkan bahwa software yang menunjukkan tidak ada sifat-sifat, yakni fleksibel, kuat, dan dapat digunakan kembali, dan yang juga memenuhi semua nya persyaratan, memiliki desain yang buruk. Dengan demikian, kita dapat menggunakan tiga sifat-sifat ini sebagai cara untuk tegas memutuskan apakah sebuah desain adalah "baik" atau "buruk". Penyebab "Bad Design". Apa yang membuat desain yang kaku, rapuh dan tak bergerak? Ini adalah saling ketergantungan dari modul dalam desain tersebut. Sebuah desain kaku jika tidak dapat dengan mudah berubah. Kekakuan tersebut adalah karena fakta bahwa perubahan tunggal untuk software berat saling dimulai riam perubahan modul tergantung. Ketika tingkat yang kaskade perubahan tidak bisa 3: The Ketergantungan Inversi Prinsip. Diprediksi oleh para desainer atau pengembang, dampak perubahan tidak dapat diperkirakan ini membuat biaya perubahan mungkin untuk memprediksi. Manajer, dihadapkan dengan ketidakpastian seperti itu, menjadi enggan untuk mengotorisasi perubahan. Dengan demikian desain menjadi resmi kaku. Kerapuhan adalah kecenderungan program untuk istirahat di banyak tempat ketika perubahan tunggal dibuat. Seringkali masalah baru di daerah yang tidak memiliki hubungan konseptual dengan daerah yang berubah. Kerapuhan seperti sangat mengurangi kredibilitas desain dan pemeliharaan organisasi. Pengguna dan manajer tidak dapat memprediksi kualitas mereka produk. Perubahan sederhana untuk salah satu bagian dari aplikasi menyebabkan kegagalan di bagian lain yang tampaknya sama sekali tidak berhubungan. Memperbaiki masalah tersebut mengarah untuk bahkan lebih banyak masalah, dan proses pemeliharaan mulai menyerupai anjing mengejar ekornya. Sebuah desain adalah bergerak ketika bagian diinginkan dari desain sangat tergantung pada rincian lain yang tidak diinginkan. Desainer bertugas menyelidiki desain untuk melihat apakah itu dapat digunakan kembali dalam aplikasi yang berbeda mungkin akan terkesan dengan seberapa baik desain akan dilakukan di aplikasi baru. Namun jika desain sangat saling tergantung, maka mereka desainer juga akan gentar dengan jumlah pekerjaan yang diperlukan untuk memisahkan bagian yang diinginkan dari desain dari bagian-bagian lain dari desain yang diinginkan. Dalam kebanyakan kasus, desain tersebut tidak digunakan kembali karena biaya pemisahan dianggap lebih tinggi daripada biaya pembangunan kembali desain. Contoh: program "Copy". Contoh sederhana dapat membantu untuk membuat titik ini. Mempertimbangkan program sederhana yang dibebankan dengan tugas menyalin karakter diketik di keyboard ke printer. Asumsikan, lebih jauh lagi, bahwa platform implementasi tidak memiliki operasi sistem yang mendukung kemerdekaan perangkat. Kita mungkin membayangkan struktur untuk program ini yang terlihat seperti Gambar 1: Gambar 1 adalah "struktur grafik" 1. Hal ini menunjukkan bahwa ada tiga modul, atau subprogram, dalam aplikasi. "Copy" modul panggilan dua lainnya. Satu dapat dengan mudah membayangkan loop dalam "Copy" modul. (Lihat Listing 1.) Tubuh loop yang memanggil "Baca Keyboard" modul untuk mengambil karakter dari keyboard, kemudian mengirimkan karakter yang ke "Menulis Printer" modul yang mencetak karakter. 1. Lihat: Panduan Praktis Untuk Terstruktur Desain Sistem, oleh Meilir Page-Jones, Yourdon Press, 1988. Gambar 1. Copy Program Copy Baca Keyboard Write Printer 4 Ketergantungan Inversi Kedua modul tingkat rendah yang baik dapat digunakan kembali. Mereka dapat digunakan di banyak lainnya program untuk mendapatkan akses ke keyboard dan printer. Ini adalah jenis yang sama dari usabilitas yang kita peroleh dari subrutin perpustakaan. Namun "Copy" modul tidak dapat digunakan kembali dalam konteks yang tidak melibatkan keyboard atau printer. Ini adalah rasa malu karena kecerdasan sistem dipertahankan dalam modul ini. Ini adalah "Copy" modul yang merangkum kebijakan yang sangat menarik bahwa kita ingin menggunakan kembali. Sebagai contoh, perhatikan program baru yang karakter salinan keyboard untuk file disk. Tentu kami ingin menggunakan kembali "Copy" modul karena merangkum tingkat tinggi kebijakan yang kita butuhkan. yaitu ia tahu bagaimana untuk menyalin karakter dari sumber ke wastafel. Sayangnya, "Copy" modul tergantung pada "Write Printer" modul, sehingga tidak dapat digunakan kembali dalam konteks baru. Kita pasti bisa memodifikasi "Copy" modul untuk memberikan baru yang diinginkan fungsi. (Lihat Daftar 2). Kita bisa menambahkan 'jika' pernyataan kebijakan dan memilikinya pilih antara "Menulis Printer" modul dan "Write Disk" modul tergantung pada beberapa jenis bendera. Namun ini menambah ketergantungan baru ke sistem. Dengan berjalannya waktu, dan semakin banyak perangkat harus berpartisipasi dalam program copy, "Copy" modul akan dikotori dengan jika / pernyataan yang lain dan akan tergantung pada banyak modul tingkat yang lebih rendah. Ini akhirnya akan menjadi kaku dan rapuh. Ketergantungan Inversi Salah satu cara untuk mengkarakterisasi masalah di atas adalah untuk melihat bahwa modul yang berisi kebijakan tingkat tinggi, yaitu Copy () modul, tergantung pada tingkat rendah rinci modul yang mengontrol. (yaitu WritePrinter () dan ReadKeyboard ()). Jika kita bisa menemukan cara untuk membuat Copy () modul independen dari detail yang mengontrol, maka kita bisa menggunakan kembali secara bebas. Kita bisa menghasilkan program lain yang digunakan modul ini untuk menyalin karakter dari setiap kekosongan Copy () {int c; sementara ((c = ReadKeyboard ()) = EOF!) WritePrinter (c);} Listing 1. Copy Program enum OutputDevice {printer, hard disk}; kekosongan Copy (outputDevice dev) {int c; sementara ((c = ReadKeyboard ( !)) = EOF) jika (dev == printer) WritePrinter (c); lain WriteDisk (c);} Listing 2. "Peningkatan" Program Copy 5: The Ketergantungan Inversi Prinsip masukan perangkat ke perangkat output. OOD memberi kita suatu mekanisme untuk melakukan ketergantungan inversi ini. Perhatikan diagram kelas sederhana pada Gambar 2. Di sini kita memiliki "Copy" kelas yang berisi abstrak "Pembaca" kelas dan abstrak "Penulis" kelas. Satu dapat dengan mudah membayangkan loop dalam "Copy" kelas yang mendapat karakter dari "Pembaca" dan mengirim mereka ke "Penulis" (Lihat Listing 3). Namun ini "Copy" kelas tidak tergantung pada "Keyboard Pembaca" maupun "Printer Penulis" sama sekali. Sehingga dependensi telah terbalik; "Copy" kelas tergantung pada abstraksi, dan pembaca rinci dan penulis tergantung pada abstraksi yang sama. Sekarang kita dapat menggunakan kembali "Copy" kelas, secara independen dari "Keyboard Pembaca" dan "Printer Writer". Kita bisa Inve
Being translated, please wait..
