Apa itu anti-pola?

193

Saya mempelajari pola dan anti-pola. Saya memiliki ide yang jelas tentang pola, tetapi saya tidak mendapatkan pola anti. Definisi dari web dan Wikipedia banyak membingungkan saya.

Adakah yang bisa menjelaskan kepada saya dengan kata sederhana apa itu anti-pola? Apa tujuannya? Apa yang mereka lakukan? Apakah itu hal yang buruk atau baik?

g. revolusi
sumber
Itu dianggap buruk, tetapi mungkin satu-satunya solusi. Berpikir dua kali dan pergi.
Константин Ван

Jawaban:

244

Anti-pola adalah pola tertentu dalam pengembangan perangkat lunak yang dianggap praktik pemrograman yang buruk.

Berbeda dengan pola desain yang merupakan pendekatan umum untuk masalah umum yang telah diformalkan dan umumnya dianggap sebagai praktik pembangunan yang baik, anti-pola adalah sebaliknya dan tidak diinginkan.

Misalnya, dalam pemrograman berorientasi objek, idenya adalah untuk memisahkan perangkat lunak menjadi potongan-potongan kecil yang disebut objek. Anti-pola dalam pemrograman berorientasi objek adalah objek Dewa yang melakukan banyak fungsi yang akan lebih baik dipisahkan menjadi objek yang berbeda.

Sebagai contoh:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

Contoh di atas memiliki objek yang melakukan segalanya . Dalam pemrograman berorientasi objek, akan lebih baik untuk memiliki tanggung jawab yang terdefinisi dengan baik untuk objek yang berbeda untuk menjaga kode kurang digabungkan dan pada akhirnya lebih dapat dipelihara:

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

Intinya adalah ada cara yang baik untuk mengembangkan perangkat lunak dengan pola yang umum digunakan ( pola desain ), tetapi ada juga cara perangkat lunak dikembangkan dan diimplementasikan yang dapat menyebabkan masalah. Pola yang dianggap praktik pengembangan perangkat lunak yang buruk adalah anti-pola.

coobird
sumber
9
ada contoh lain dari Anti-Pola di samping GodObject?
Tomasz Mularczyk
@Tomasz Programming Pasta berfungsi adalah salah satu contohnya. Paling baik digeneralisasikan sebagai enkapsulasi yang buruk antara banyak objek kecil. Anggap itu kebalikan dari objek Dewa en.wikipedia.org/wiki/Spaghetti_code
AWrightIV
@ Thomasz segala sesuatu yang buruk, tetapi dilakukan oleh beberapa orang, adalah antipattern. Misalnya, try: <do something>; except: passmungkin antipattern Kardinal Sin dalam Python. Lihat ini: realpython.com/blog/python/…
eric
1
Dapatkah Singleton dianggap anti-pola karena membuatnya lebih sulit untuk mengejek dan menjalankan tes secara paralel (karena semua tes menggunakan dan bermutasi dengan singleton yang sama, menghasilkan inkonsistensi)?
lostsoul29
63

Setiap kali saya mendengar tentang Anti-pola, saya ingat istilah lain yaitu. Bau desain.

"Bau desain adalah struktur tertentu dalam desain yang mengindikasikan pelanggaran prinsip-prinsip desain dasar dan berdampak negatif terhadap kualitas desain". (Dari "Refactoring untuk Bau Desain Perangkat Lunak: Mengelola utang teknis")

Ada banyak bau desain yang diklasifikasikan berdasarkan melanggar prinsip desain:

Bau abstraksi

Abstraksi Hilang: Aroma ini muncul ketika rumpun data atau string yang disandikan digunakan alih-alih membuat kelas atau antarmuka.

Abstraksi Imperatif: Bau ini timbul ketika suatu operasi diubah menjadi kelas.

Abstraksi Tidak Lengkap: Aroma ini muncul ketika abstraksi tidak mendukung metode komplementer atau saling terkait sepenuhnya.

Abstraksi Beraneka Ragam: Bau ini muncul ketika suatu abstraksi memiliki lebih dari satu tanggung jawab yang ditetapkan padanya.

Abstraksi yang Tidak Perlu: Bau ini terjadi ketika abstraksi yang sebenarnya tidak diperlukan (dan dengan demikian bisa dihindari) diperkenalkan dalam desain perangkat lunak.

Abstraksi Tidak Dimanfaatkan: Bau ini muncul ketika abstraksi dibiarkan tidak digunakan (baik yang tidak langsung digunakan atau tidak dapat dijangkau).

Duplikat Abstraksi: Aroma ini muncul ketika dua atau lebih abstraksi memiliki nama yang identik atau implementasi yang identik atau keduanya.

Aroma enkapsulasi

Enkapsulasi Kurang: Bau ini terjadi ketika aksesibilitas yang dinyatakan dari satu atau lebih anggota abstraksi lebih permisif daripada yang sebenarnya diperlukan.

Enkapsulasi Leaky: Aroma ini muncul ketika abstraksi “mengekspos” atau “kebocoran” detail implementasi melalui antarmuka publiknya.

Enkapsulasi Tidak Ada: Bau ini terjadi ketika variasi implementasi tidak dienkapsulasi dalam abstraksi atau hierarki.

Enkapsulasi yang tidak dieksploitasi: Aroma ini muncul ketika kode klien menggunakan pemeriksaan tipe eksplisit (menggunakan if-else dirantai atau beralih pernyataan yang memeriksa jenis objek) alih-alih mengeksploitasi variasi dalam tipe yang sudah dienkapsulasi dalam hierarki.

Modularisasi berbau

Modularisasi Rusak: Bau ini muncul ketika data dan / atau metode yang idealnya dilokalisasi menjadi abstraksi tunggal dipisahkan dan tersebar di berbagai abstraksi.

Modularisasi yang Tidak Memadai: Bau ini muncul ketika abstraksi ada yang belum sepenuhnya terurai, dan penguraian lebih lanjut dapat mengurangi ukurannya, kompleksitas implementasi, atau keduanya.

Modularisasi Cyclically-Dependent: Bau ini muncul ketika dua atau lebih abstraksi bergantung satu sama lain secara langsung atau tidak langsung (menciptakan hubungan yang erat antara abstraksi).

Modularisasi Hub-Like: Bau ini muncul ketika abstraksi memiliki dependensi (baik yang masuk dan keluar) dengan sejumlah besar abstraksi lainnya.

Bau hirarki

Hilang Hirarki: Aroma ini muncul ketika segmen kode menggunakan logika kondisional (biasanya bersama dengan "tipe yang ditandai") untuk secara eksplisit mengelola variasi dalam perilaku di mana hierarki dapat dibuat dan digunakan untuk merangkum variasi tersebut.

Hierarki yang Tidak Perlu: Aroma ini muncul ketika seluruh hierarki warisan tidak diperlukan, menunjukkan bahwa warisan telah diterapkan secara tidak perlu untuk konteks desain tertentu.

Hirarki yang Tidak Difaktor: Aroma ini muncul ketika ada duplikasi yang tidak perlu di antara tipe-tipe dalam hierarki.

Hirarki Luas: Aroma ini muncul ketika hierarki warisan terlalu lebar yang mengindikasikan bahwa jenis peralihan mungkin hilang.

Hierarki Spekulatif: Aroma ini muncul ketika satu atau lebih tipe dalam hierarki disediakan secara spekulatif (yaitu, berdasarkan pada kebutuhan yang dibayangkan daripada persyaratan yang sebenarnya).

Hirarki Mendalam: Aroma ini muncul ketika hierarki pewarisan “terlalu berlebihan” dalam.

Rebellious Hierarchy: Aroma ini muncul ketika subtipe menolak metode yang disediakan oleh supertype-nya.

Patah Hierarki: Bau ini muncul ketika supertipe dan subtipenya secara konseptual tidak berbagi hubungan "IS-A" yang mengakibatkan penggantian yang rusak.

Hirarki Multipath: Aroma ini muncul ketika subtipe mewarisi baik secara langsung maupun tidak langsung dari supertipe yang mengarah ke jalur pewarisan yang tidak perlu dalam hierarki.

Hirarki Cyclic: Bau ini muncul ketika suatu supertipe dalam hierarki tergantung pada subtipe mana pun.


Definisi dan klasifikasi di atas dijelaskan dalam "Refactoring untuk bau desain perangkat lunak: Mengelola utang teknis ". Beberapa sumber daya yang lebih relevan dapat ditemukan di sini .

Alex
sumber
41

Pola adalah gagasan tentang bagaimana memecahkan masalah beberapa kelas. Anti-pola adalah gagasan tentang bagaimana tidak menyelesaikannya karena menerapkan gagasan itu akan menghasilkan desain yang buruk.

Contoh: "pola" akan menggunakan fungsi untuk menggunakan kembali kode, "anti-pola" adalah menggunakan salin-tempel untuk hal yang sama. Keduanya memecahkan masalah yang sama, tetapi menggunakan fungsi biasanya mengarah pada kode yang lebih mudah dibaca dan dikelola daripada salin-tempel.

sharptooth
sumber
18

Anti-pola adalah cara untuk tidak menyelesaikan masalah. Tetapi ada lebih dari itu: itu juga cara yang sering terlihat dalam upaya untuk memecahkan masalah.

Ralph M. Rickenbach
sumber
13

Jika Anda benar-benar ingin mempelajari AntiPatterns, dapatkan buku AntiPatterns (ISBN-13: 978-0471197133).

Di dalamnya, mereka mendefinisikan "AntiPattern adalah bentuk sastra yang menggambarkan solusi yang biasa terjadi untuk masalah yang menghasilkan konsekuensi negatif."

Jadi, jika ini adalah praktik pemrograman yang buruk tetapi bukan yang umum — terbatas pada satu aplikasi, satu perusahaan atau satu programmer, itu tidak memenuhi bagian "Pola" dari definisi AntiPattern.

kmarsh
sumber
9

Cara umum membuat berantakan. Seperti kelas dewa / kitchensink (melakukan segalanya), misalnya.

Robert Gould
sumber
6

Menariknya, cara tertentu untuk memecahkan masalah bisa berupa pola dan anti-pola. Singleton adalah contoh utama dari ini. Ini akan muncul di kedua set literatur.

Ed Sykes
sumber
6

Sebuah anti-pola adalah pelengkap dari pola desain . Anti-pola adalah solusi templat yang tidak boleh Anda gunakan dalam situasi tertentu.

xxmajia
sumber
6

Sama seperti dengan pola desain , anti-pola juga merupakan template dan cara yang berulang untuk menyelesaikan masalah tertentu, tetapi dengan cara yang tidak optimal dan tidak efektif.

Darnell
sumber
4

Saat ini, para peneliti dan praktisi rekayasa perangkat lunak sering menggunakan istilah "anti-pola" dan "bau" secara bergantian. Namun, secara konseptual mereka tidak sama. Entri anti-pola Wikipedia menyatakan bahwa anti-pola berbeda dari praktik buruk atau ide buruk oleh setidaknya dua faktor. Anti-polanya adalah

"Proses, struktur, atau pola tindakan yang biasa digunakan yang meskipun pada awalnya tampak sebagai respons yang tepat dan efektif untuk suatu masalah, biasanya memiliki konsekuensi yang lebih buruk daripada hasil yang bermanfaat."

Ini dengan jelas menunjukkan bahwa anti-pola dipilih dengan keyakinan bahwa itu adalah solusi yang baik (sebagai pola) untuk masalah yang disajikan; Namun, itu membawa lebih banyak kewajiban daripada manfaat. Di sisi lain, aroma hanyalah praktik buruk yang secara negatif mempengaruhi kualitas sistem perangkat lunak. Sebagai contoh, Singleton adalah anti-pola dan kelas Dewa (atau Modulisasi Tidak Cukup) adalah bau desain.

Tushar
sumber
2

Anti-pola adalah cara umum orang cenderung memprogram dengan cara yang salah, atau setidaknya cara yang tidak begitu baik.

Roman A. Taycher
sumber
0

Setiap pola desain yang melakukan lebih banyak kerusakan daripada manfaatnya bagi lingkungan pengembangan perangkat lunak yang diberikan akan dianggap sebagai anti-pola.

Beberapa anti-pola jelas tetapi beberapa tidak. Misalnya Singleton, walaupun banyak yang menganggapnya sebagai pola desain lama yang baik tetapi ada yang tidak.

Anda dapat memeriksa pertanyaan Apa yang sangat buruk tentang lajang? untuk lebih memahami perbedaan pendapat di dalamnya.

Himanshu Negi
sumber
Sebenarnya, pola anti umumnya tidak jelas. Jelas pola desain yang buruk hanyalah pola desain yang buruk. Sebuah anti-pola asli terlihat dapat bertahan di permukaan, tetapi memanifestasikan masalah di kemudian hari. Faktanya, tidak jelas-jelas buruk adalah perbedaan yang menjadikan mereka sebagai anti-pola sejak awal.
hawkeyegold
0

Seperti dalam Algoritma Anda dapat mencapai solusi menggunakan kekuatan Brute, tetapi Anda harus membayar banyak jika situasinya menjadi kompleks.

Shailesh kumar
sumber