Pertanyaan Apakah Inversi Kontrol itu?


Inversion of Control (atau IoC) bisa sangat membingungkan ketika pertama kali ditemukan.

  1. Apa itu?
  2. Masalah apa yang dipecahkannya?
  3. Kapan tepat dan kapan tidak?

1426
2017-08-06 03:35


asal


Jawaban:


Pola Inversion of Control (IoC) dan Dependency Injection (DI) adalah tentang menghapus dependensi dari kode Anda.

Misalnya, aplikasi Anda memiliki komponen editor teks dan Anda ingin memberikan pemeriksaan ejaan. Kode standar Anda akan terlihat seperti ini:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

Apa yang kami lakukan di sini menciptakan ketergantungan antara TextEditor dan SpellChecker. Dalam skenario IOC kita malah akan melakukan sesuatu seperti ini:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

Dalam contoh kode pertama, kami memberikan contoh SpellChecker (this.checker = new SpellChecker();), yang berarti TextEditor kelas langsung tergantung pada SpellChecker kelas.

Dalam contoh kode kedua kita membuat abstraksi dengan memiliki SpellChecker kelas ketergantungan dalam TextEditor tanda tangan konstruktor (tidak menginisialisasi ketergantungan di kelas). Ini memungkinkan kita untuk memanggil dependensi lalu meneruskannya ke kelas TextEditor seperti:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Sekarang klien menciptakan TextEditor kelas memiliki kontrol atas mana SpellChecker implementasi untuk digunakan karena kami menyuntikkan ketergantungan pada TextEditor tanda tangan.

Ini hanya contoh sederhana, ada serangkaian artikel yang bagus oleh Simone Busoli yang menjelaskannya secara lebih rinci.


1137
2017-08-06 07:22



Inversion of Control adalah apa yang Anda dapatkan ketika callback program Anda, mis. seperti program gui.

Misalnya, di menu sekolah lama, Anda mungkin memiliki:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

dengan demikian mengendalikan aliran interaksi pengguna.

Dalam program GUI atau entah bagaimana, kita katakan

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

Jadi sekarang kontrol terbalik ... alih-alih komputer menerima input pengguna dalam urutan tetap, pengguna mengontrol urutan di mana data dimasukkan, dan kapan data disimpan dalam database.

Pada dasarnya, apa pun dengan loop peristiwa, callback, atau jalankan pemicu termasuk dalam kategori ini.


495
2017-08-06 05:42



Apakah Inversi Kontrol itu?

Jika Anda mengikuti dua langkah sederhana ini, Anda telah melakukan inversi kontrol:

  1. Terpisah apa-untuk melakukan bagian dari kapan-untuk melakukan bagian.
  2. Memastikan bahwa kapan bagian yang dikenal sebagai sedikit mungkin tentang apa bagian; dan sebaliknya.

Ada beberapa teknik yang mungkin untuk masing-masing langkah ini berdasarkan teknologi / bahasa yang Anda gunakan untuk implementasi Anda.

-

Itu inversi bagian dari Inversion of Control (IoC) adalah hal yang membingungkan; karena inversi adalah istilah relatif. Cara terbaik untuk memahami IoC adalah melupakan kata itu!

-

Contoh

  • Penanganan Acara. Penangan Acara (bagian apa yang harus dilakukan) - Acara Pembangkitan (bagian kapan saja)
  • Antarmuka. Klien komponen (bagian kapan saja) - Implementasi Antarmuka Komponen (bagian apa yang harus dilakukan)
  • xUntuk memperbaiki. Setup dan TearDown (bagian apa-ke-do) - xUnit kerangka panggilan ke Setup di awal dan TearDown di bagian akhir (kapan-to-do)
  • Pola desain metode template. metode template kapan harus melakukan bagian - implementasi subkelas primitif bagian apa yang harus dilakukan
  • Metode kontainer DLL di COM. DllMain, DllCanUnload, dll (bagian apa-ke-do) - COM / OS (bagian kapan saja)

359
2017-07-22 17:34



Inversion of Controls adalah tentang memisahkan masalah.

Tanpa IoC: Anda memiliki laptop komputer dan Anda secara tidak sengaja merusak layar. Dan sialan, Anda menemukan layar laptop model yang sama tidak ada di pasaran. Jadi kamu terjebak.

Dengan IoC: Anda memiliki Desktop komputer dan Anda secara tidak sengaja merusak layar. Anda menemukan Anda dapat mengambil hampir semua monitor desktop dari pasar, dan itu bekerja dengan baik dengan desktop Anda.

Desktop Anda berhasil mengimplementasikan IoC dalam kasus ini. Ini menerima berbagai jenis monitor, sedangkan laptop tidak, perlu layar tertentu untuk diperbaiki.


89
2017-09-25 14:24



Inversion of Control, (atau IoC), adalah tentang mendapatkan kebebasan (Anda menikah, Anda kehilangan kebebasan dan Anda sedang dikendalikan. Anda bercerai, Anda baru saja menerapkan Inversi Kontrol. Itulah yang kami sebut, "dipisahkan". Sistem komputer yang baik menghambat beberapa hubungan yang sangat dekat.) lebih banyak fleksibilitas (Dapur di kantor Anda hanya menyediakan air ledeng yang bersih, itulah satu-satunya pilihan Anda ketika Anda ingin minum. Bos Anda menerapkan Inversion of Control dengan membuat mesin kopi baru. Sekarang Anda mendapatkan fleksibilitas untuk memilih air keran atau kopi. ) dan lebih sedikit ketergantungan (Pasangan Anda memiliki pekerjaan, Anda tidak memiliki pekerjaan, Anda secara finansial bergantung pada pasangan Anda, sehingga Anda dikendalikan. Anda menemukan pekerjaan, Anda telah menerapkan Inversion of Control. Sistem komputer yang baik mendorong ketergantungan.)

Ketika Anda menggunakan komputer desktop, Anda telah bekerja keras (atau katakan, terkontrol). Anda harus duduk di depan layar dan melihatnya. Menggunakan keyboard untuk mengetik dan menggunakan mouse untuk bernavigasi. Dan perangkat lunak yang ditulis dengan buruk dapat menjadikan Anda lebih lagi menjadi budak. Jika Anda mengganti desktop Anda dengan laptop, maka Anda agak membelokkan kendali. Anda dapat dengan mudah mengambilnya dan bergerak. Jadi sekarang Anda dapat mengontrol di mana Anda berada dengan komputer Anda, bukan komputer Anda mengendalikannya.

Dengan menerapkan Inversion of Control, konsumen perangkat lunak / objek mendapatkan lebih banyak kontrol / opsi atas perangkat lunak / objek, bukannya dikendalikan atau memiliki opsi yang lebih sedikit.

Dengan pemikiran di atas dalam pikiran. Kami masih merindukan bagian kunci dari IoC. Dalam skenario IoC, perangkat lunak / objek konsumen adalah kerangka kerja yang canggih. Itu berarti kode yang Anda buat tidak dipanggil sendiri. Sekarang mari kita jelaskan mengapa cara ini berfungsi lebih baik untuk aplikasi web.

Misalkan kode Anda adalah sekelompok pekerja. Mereka perlu membangun mobil. Para pekerja ini membutuhkan tempat dan peralatan (kerangka kerja perangkat lunak) untuk membangun mobil. SEBUAH tradisional kerangka perangkat lunak akan seperti garasi dengan banyak alat. Jadi para pekerja perlu membuat rencana sendiri dan menggunakan alat untuk membangun mobil. Membangun mobil bukanlah bisnis yang mudah, akan sangat sulit bagi para pekerja untuk merencanakan dan bekerja sama dengan baik. SEBUAH modern kerangka perangkat lunak akan seperti pabrik mobil modern dengan semua fasilitas dan manajer di tempat. Para pekerja tidak harus membuat rencana apa pun, para manajer (bagian dari kerangka kerja, mereka adalah orang-orang terpintar dan membuat rencana paling canggih) akan membantu mengoordinasikan sehingga para pekerja tahu kapan harus melakukan pekerjaan mereka (kerangka kerja memanggil kode Anda). Para pekerja hanya perlu cukup fleksibel untuk menggunakan alat apa pun yang diberikan manajer kepada mereka (dengan menggunakan Injeksi Ketergantungan).

Meskipun para pekerja memberikan kendali mengelola proyek di tingkat atas kepada para manajer (kerangka kerja). Tetapi ada baiknya untuk membantu beberapa profesional. Ini adalah konsep IoC yang benar-benar berasal.

Aplikasi Web modern dengan arsitektur MVC bergantung pada kerangka kerja untuk melakukan Perutean URL dan menempatkan Pengontrol pada tempatnya untuk kerangka panggilan.

Ketergantungan Injeksi dan Pembalikan Kontrol terkait. Ketergantungan Injeksi ada di mikro level dan Inversion of Control berada di makro tingkat. Anda harus makan setiap gigitan (menerapkan DI) untuk menyelesaikan makan (melaksanakan IoC).


80
2018-03-04 19:33



Sebelum menggunakan Inversion of Control Anda harus menyadari fakta bahwa ia memiliki kelebihan dan kekurangannya dan Anda harus tahu mengapa Anda menggunakannya jika Anda melakukannya.

Kelebihan:

  • Kode Anda akan dipisahkan sehingga Anda dapat dengan mudah bertukar implementasi antarmuka dengan implementasi alternatif
  • Ini adalah motivator yang kuat untuk pengkodean terhadap antarmuka bukan implementasi
  • Sangat mudah untuk menulis tes unit untuk kode Anda karena itu tidak bergantung pada objek yang diterima dalam konstruktor / setter dan Anda dapat dengan mudah menginisialisasi mereka dengan objek yang tepat dalam isolasi.

Cons:

  • IOC tidak hanya membalikkan aliran kontrol dalam program Anda, tetapi juga awan itu sangat banyak. Ini berarti Anda tidak bisa lagi membaca kode Anda dan melompat dari satu tempat ke tempat lain karena koneksi yang biasanya ada di kode Anda tidak ada dalam kode lagi. Sebaliknya itu dalam file konfigurasi XML atau anotasi dan dalam kode wadah IoC Anda yang menafsirkan metadata ini.
  • Ada munculnya bug kelas baru di mana Anda mendapatkan konfigurasi XML atau anotasi Anda salah dan Anda dapat menghabiskan banyak waktu mencari tahu mengapa wadah IoC Anda menyuntikkan referensi nol ke salah satu objek Anda dalam kondisi tertentu.

Secara pribadi saya melihat titik kuat IoC dan saya sangat menyukainya tetapi saya cenderung menghindari IoC kapan saja karena mengubah perangkat lunak Anda menjadi kumpulan kelas yang tidak lagi merupakan program "nyata" tetapi hanya sesuatu yang perlu disatukan oleh Konfigurasi XML atau metadata anotasi dan akan jatuh (dan jatuh) terpisah tanpanya.


73
2018-02-12 14:31



  1. Artikel Wikipedia. Bagi saya, inversi kontrol mengubah kode yang ditulis secara berurutan dan mengubahnya menjadi struktur delegasi. Alih-alih program Anda secara eksplisit mengendalikan segalanya, program Anda menyiapkan kelas atau perpustakaan dengan fungsi-fungsi tertentu untuk dipanggil ketika hal-hal tertentu terjadi.

  2. Ini memecahkan duplikasi kode. Sebagai contoh, di masa lalu Anda akan secara manual menulis loop kejadian Anda sendiri, polling perpustakaan sistem untuk acara baru. Saat ini, API paling modern Anda cukup memberi tahu pustaka sistem tentang peristiwa apa yang Anda minati, dan itu akan memberi tahu Anda kapan peristiwa itu terjadi.

  3. Pembalikan kontrol adalah cara praktis untuk mengurangi duplikasi kode, dan jika Anda menemukan diri Anda menyalin seluruh metode dan hanya mengubah sepotong kecil kode, Anda dapat mempertimbangkan untuk menanganinya dengan inversi kontrol. Inversi kontrol dibuat mudah dalam banyak bahasa melalui konsep delegasi, antarmuka, atau bahkan pointer fungsi baku.

    Tidaklah tepat untuk digunakan dalam semua kasus, karena aliran suatu program dapat lebih sulit untuk diikuti ketika ditulis dengan cara ini. Ini adalah cara yang berguna untuk merancang metode ketika menulis pustaka yang akan digunakan kembali, tetapi harus digunakan secara hemat dalam inti program Anda sendiri kecuali benar-benar memecahkan masalah duplikasi kode.


55
2017-08-06 04:33