Results (
Indonesian) 2:
[Copy]Copied!
1
Open-Closed Prinsip
ini adalah pertama saya Rekayasa 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
notasi untuk mendokumentasikan berorientasi objek desain. Sidebar menyediakan leksikon singkat
notasi Booch ini.
Ada banyak heuristik terkait dengan desain berorientasi objek. Misalnya, "semua
variabel anggota harus pribadi", atau "variabel global harus dihindari", atau "menggunakan
identifikasi jenis run time (RTTI) berbahaya". Apa sumber heuristik ini?
Apa yang membuat mereka benar? Apakah mereka alwaystrue? Kolom ini menyelidiki prinsip desain yang mendasari heuristik ini - prinsip terbuka tertutup.
Seperti Ivar Jacobson mengatakan: "Semua sistem berubah selama siklus hidup mereka. Ini harus
diingat ketika mengembangkan sistem diperkirakan berlangsung lebih lama dari versi pertama.
"1
Bagaimana kita bisa membuat desain yang stabil dalam menghadapi perubahan dan yang akan bertahan lebih lama
dari versi pertama? Bertrand Meyer
2
memberikan bimbingan selama lalu sebagai 1988 ketika ia
menciptakan prinsip terbuka-tertutup sekarang terkenal. Mengutip dia:
SOFTWAREENTITIES (CLASSES, MODUL, FUNGSI, DLL)
SHOULDBEOPENFOREXTENSION,
BUTCLOSEDFOR. MODIFIKASI
Ketika satu perubahan untuk hasil program riam perubahan modul tergantung,
program yang menunjukkan atribut yang tidak diinginkan bahwa kita telah datang untuk mengasosiasikan dengan "buruk"
desain. Program ini menjadi rapuh, kaku, tak terduga dan unreusable. Serangan prinsip openclosed ini dalam cara yang sangat mudah. Ia mengatakan bahwa Anda harus merancang
modul yang tidak pernah berubah. Ketika perubahan persyaratan, Anda memperpanjang perilaku seperti
modul dengan menambahkan kode baru, bukan dengan mengubah kode lama yang sudah bekerja.
Deskripsi
Modul yang sesuai dengan prinsip terbuka tertutup memiliki dua atribut utama.
1. Software Berorientasi objek Insinyur Pendekatan Gunakan Kasus Didorong, Ivar Jacobson, Addison
Wesley, 1992, hal 21.
2. Obyek Software Berorientasi Konstruksi, Bertrand Meyer, Prentice Hall, 1988, p 23
2 Keterangan
1. Mereka adalah "Open Untuk Extension".
Ini berarti bahwa perilaku modul dapat diperpanjang. Bahwa kita dapat membuat
berperilaku modul dalam cara-cara baru dan berbeda sebagai persyaratan perubahan aplikasi, atau untuk memenuhi kebutuhan aplikasi baru.
2. Mereka "Ditutup untuk Modifikasi".
Kode sumber dari modul tersebut adalah terhormat. Tidak ada yang diperbolehkan untuk membuat sumber
perubahan kode untuk itu.
Akan terlihat bahwa kedua sifat ini bertentangan satu sama lain. Cara biasa untuk
memperpanjang perilaku modul adalah untuk membuat perubahan pada modul itu. Sebuah modul yang tidak dapat
diubah biasanya dianggap memiliki perilaku tetap. Bagaimana bisa kedua melawan
atribut diselesaikan?
Abstraksi adalah Kunci.
Dalam C ++, menggunakan prinsip-prinsip desain berorientasi objek, adalah mungkin untuk membuat abstraksi
yang tetap dan belum mewakili kelompok terbatas perilaku mungkin. Abstraksi yang kelas dasar abstrak, dan kelompok terbatas dari perilaku yang mungkin diwakili oleh semua kelas turunan mungkin. Hal ini dimungkinkan untuk modul untuk memanipulasi
abstraksi. Modul tersebut dapat ditutup untuk modifikasi karena tergantung pada sebuah
abstraksi yang tetap. Namun perilaku modul yang dapat diperpanjang dengan menciptakan baru
turunan dari abstraksi.
Gambar 1 menunjukkan desain sederhana yang tidak sesuai dengan prinsip terbuka tertutup.
Kedua Clientand Serverclasses beton. Tidak ada jaminan bahwa fungsi anggota Serverclass adalah virtual. The Clientclass usesthe Serverclass.
Jika kita ingin untuk Clientobject untuk menggunakan objek server yang berbeda, maka Clientclass
harus diubah untuk nama kelas server baru.
Gambar 2 menunjukkan desain yang sesuai yang sesuai dengan prinsip terbuka tertutup.
Dalam hal ini, yang AbstractServerclass adalah kelas abstrak dengan anggota murni-virtual
fungsi. yang Clientclass menggunakan abstraksi ini. Namun obyek dari Clientclass
akan menggunakan obyek dari Serverclass derivatif. Jika kita ingin Clientobjects menggunakan
kelas server yang berbeda, maka turunan baru dari AbstractServerclass dapat dibuat. The Clientclass dapat tetap tidak berubah.
Gambar 1
Client Tertutup
Client Server
3: The Open-Closed Prinsip
yang ShapeAbstraction
Perhatikan contoh berikut. Kami memiliki aplikasi yang harus mampu menggambar lingkaran
dan kotak pada GUI standar. Lingkaran dan kotak harus ditarik tertentu
agar. Daftar lingkaran dan kotak akan dibuat dalam urutan yang tepat dan program harus berjalan daftar agar dan menarik setiap lingkaran atau persegi.
Dalam C, menggunakan teknik prosedural yang tidak sesuai dengan prinsip terbuka-tertutup,
kita mungkin memecahkan masalah ini seperti yang ditunjukkan pada Listing 1. Di sini kita melihat satu set struktur data
yang memiliki yang sama pertama elemen, tetapi berbeda di luar itu. Elemen pertama dari masing-masing
jenis kode yang mengidentifikasi struktur data baik sebagai lingkaran atau persegi. Fungsi
DrawAllShapeswalks array pointer ke struktur data ini, memeriksa jenis
kode dan kemudian memanggil fungsi yang sesuai (baik DrawCircleor DrawSquare).
Gambar 2
Buka Client
Listing 1
Solusi Prosedural ke Square / Lingkaran Masalah
enum ShapeType {lingkaran, persegi};
struct Bentuk
{ShapeType itsType;}; struct Lingkaran {ShapeType itsType; ganda itsRadius, Titik itsCenter;}; Client Abstrak Server Server A 4 The Shape Abstraksi Fungsi DrawAllShapesdoes tidak sesuai dengan prinsip terbuka-tertutup karena tidak dapat ditutup terhadap jenis baru bentuk. Jika saya ingin memperpanjang fungsi ini untuk dapat menarik daftar bentuk yang termasuk segitiga, saya harus memodifikasi fungsi. Bahkan, saya harus memodifikasi fungsi untuk setiap jenis baru dari bentuk yang saya butuhkan untuk menarik. Tentu saja program ini hanya contoh sederhana. Dalam kehidupan nyata switchstatement di DrawAllShapesfunction akan diulang lagi dan lagi dalam berbagai fungsi seluruh aplikasi; masing-masing melakukan sesuatu yang sedikit berbeda. Menambahkan baru bentuk untuk aplikasi seperti itu berarti berburu untuk setiap tempat yang switchstatements seperti (atau jika / elsechains) ada, dan menambahkan bentuk baru untuk setiap. Selain itu, sangat tidak mungkin bahwa semua switchstatements dan jika / elsechains akan semanis disusun sebagai satu di DrawAllShapes. Hal ini jauh lebih mungkin bahwa predikat dari jika struct Lapangan {ShapeType itsType; ganda itsSide, Titik itsTopLeft;}; // // fungsi ini dilaksanakan di tempat lain // kekosongan DrawSquare (struct Lapangan *) batal DrawCircle (struct Lingkaran *) ; typedef struct Shape * ShapePointer; kekosongan DrawAllShapes (daftar ShapePointer [], int n) {int i; for (i = 0; i
{Struct Bentuk * s = daftar [i]; switch (s-> itsType) {kasus persegi: DrawSquare ((struct Lapangan *) s); break; kasus lingkaran: DrawCircle ((struct Lingkaran *) s); break;} }} Listing 1 (Lanjutan) Solusi Prosedural ke Square / Lingkaran Soal 5: The Open-Closed Prinsip pernyataan akan dikombinasikan dengan operator logika, atau bahwa caseclauses dari switchstatements akan digabungkan sehingga "menyederhanakan" pengambilan keputusan lokal . Dengan demikian masalah menemukan dan memahami semua tempat di mana bentuk baru perlu ditambahkan dapat non-sepele. Kode 2 menunjukkan kode untuk solusi untuk masalah persegi / lingkaran yang sesuai dengan prinsip terbuka tertutup. Dalam hal ini sebuah Shapeclass abstrak dibuat. Abstrak ini kelas memiliki fungsi murni virtual tunggal yang disebut Draw. Kedua Circleand Squareare turunan dari Shapeclass. Perhatikan bahwa jika kita ingin memperpanjang perilaku DrawAllShapesfunction di properti 2 untuk menarik jenis baru bentuk, semua yang perlu kita lakukan adalah menambahkan turunan baru dari Shapeclass. The DrawAllShapesfunction tidak perlu mengubah. Sehingga DrawAllShapesconforms prinsip terbuka tertutup. Perilakunya dapat diperpanjang tanpa modifikasi. Dalam dunia nyata Shapeclass akan memiliki lebih banyak metode. Namun menambahkan baru bentuk untuk aplikasi masih cukup sederhana karena semua yang diperlukan adalah untuk menciptakan baru derivatif dan melaksanakan semua fungsinya. Tidak perlu untuk berburu melalui semua aplikasi mencari tempat-tempat yang memerlukan perubahan. Sejak program yang sesuai dengan prinsip terbuka-tertutup diubah dengan menambahkan baru kode, bukan dengan mengubah kode yang ada, mereka tidak mengalami riam perubahan ditunjukkan oleh program yang tidak sesuai. Listing 2 OOD solusi untuk Square / Lingkaran masalah. class Shape {public: virtual void Draw () const = 0;}; class Square: Bentuk umum {public: virtual void Draw () const;}; kelas Lingkaran: Bentuk umum {public: virtual void Draw () const;}; kekosongan DrawAllShapes (Set
& Daftar)
{for (Iterator
i (daftar); i; i ++)
(* i) -> Menggambar
();}
6 Strategis Penutupan
Strategis Penutupan
Ini harus jelas bahwa tidak ada program yang signifikan bisa 100% tertutup. Sebagai contoh, perhatikan
apa yang akan terjadi DrawAllShapesfunction dari properti 2 jika kami memutuskan bahwa
semua Circlesshould ditarik sebelum Squares. DrawAllShapesfunction yang
tidak tertutup terhadap perubahan seperti ini. Secara umum, tidak peduli seberapa "ditutup" modul adalah, ada
akan selalu ada beberapa jenis perubahan terhadap yang tidak ditutup.
Karena penutupan tidak bisa lengkap, itu harus strategis. Artinya, perancang harus
memilih jenis perubahan terhadap yang untuk menutup desain. Ini mengambil sejumlah
dari pengetahuanNya berasal dari pengalaman. Desainer berpengalaman tahu pengguna dan
industri cukup baik untuk menilai probabilitas berbagai jenis perubahan. Dia kemudian membuat
memastikan bahwa prinsip terbuka tertutup dipanggil untuk perubahan yang paling mungkin.
Menggunakan Abstraksi Keuntungan eksplisit Penutupan.
Bagaimana kita bisa menutup DrawAllShapesfunction terhadap perubahan pemesanan
menggambar? Ingat penutupan yang didasarkan pada abstraksi. Dengan demikian, dalam rangka untuk menutup
DrawAllShapesagainst memesan, kami membutuhkan beberapa
Being translated, please wait..
