Perlu diingat metrik stabilitas Martin dan apa yang ia maksud dengan "stabilitas":
Instability = Ce / (Ca+Ce)
Atau:
Instability = Outgoing / (Incoming+Outgoing)
Yaitu, sebuah paket dianggap sepenuhnya tidak stabil jika semua dependensinya keluar: ia menggunakan hal-hal lain, tetapi tidak ada yang menggunakannya. Dalam hal itu, masuk akal untuk hal itu menjadi konkret. Ini juga akan menjadi jenis kode yang paling mudah untuk diubah karena tidak ada yang menggunakannya, dan karena itu tidak ada lagi yang bisa rusak jika kode itu dimodifikasi.
Sementara itu ketika Anda memiliki skenario yang berlawanan dari "stabilitas" lengkap dengan paket yang digunakan oleh satu atau lebih hal tetapi tidak menggunakan apa pun sendiri, seperti paket pusat yang digunakan oleh perangkat lunak, saat itulah Martin mengatakan hal ini harus abstrak. Itu juga diperkuat oleh bagian DIP dari SOLI (D), Dependency Inversion Principle, yang pada dasarnya menyatakan bahwa dependensi harus mengalir secara seragam menuju abstraksi untuk kode level rendah dan level tinggi.
Artinya, dependensi harus mengalir secara seragam ke arah "stabilitas", dan lebih tepatnya, dependensi harus mengalir ke paket dengan dependensi yang lebih masuk daripada dependensi keluar dan, selanjutnya, dependensi harus mengalir ke arah abstraksi. Inti dari alasan di balik itu adalah bahwa abstraksi menyediakan ruang bernapas untuk menggantikan satu subtipe dengan subtipe lainnya, menawarkan tingkat fleksibilitas untuk bagian beton yang mengimplementasikan antarmuka untuk berubah tanpa memutus ketergantungan yang masuk ke antarmuka abstrak tersebut.
Apakah ada kerugian signifikan tergantung pada abstraksi?
Yah, saya sebenarnya tidak setuju dengan Martin di sini untuk domain saya setidaknya, dan di sini saya perlu memperkenalkan definisi baru "stabilitas" seperti dalam, "kurang alasan untuk berubah". Dalam hal ini saya akan mengatakan dependensi harus mengalir ke stabilitas, tetapi antarmuka abstrak tidak membantu jika antarmuka abstrak tidak stabil (menurut definisi saya "tidak stabil", seperti cenderung berulang kali diubah, bukan Martin). Jika pengembang tidak bisa mendapatkan abstraksi yang benar dan klien berulang kali mengubah pikiran mereka dengan cara yang membuat abstrak mencoba memodelkan perangkat lunak tidak lengkap atau tidak efektif, maka kami tidak lagi mendapat manfaat dari peningkatan fleksibilitas antarmuka abstrak untuk melindungi sistem terhadap perubahan pemutusan ketergantungan yang bertingkat. . Dalam kasus pribadi saya, saya telah menemukan mesin ECS, seperti yang ditemukan di game AAA,paling konkret : menuju data mentah, tetapi data tersebut sangat stabil (seperti, "tidak mungkin perlu diubah"). Saya sering menemukan kemungkinan sesuatu yang membutuhkan perubahan di masa depan menjadi metrik yang lebih berguna daripada rasio eferen dengan total kopling dalam memandu keputusan SE.
Jadi saya akan mengubah DIP sedikit dan hanya mengatakan, "dependensi harus mengalir ke komponen yang memiliki probabilitas terendah memerlukan perubahan lebih lanjut", terlepas dari apakah komponen-komponen itu adalah antarmuka abstrak atau data mentah. Yang penting bagi saya adalah probabilitas bahwa mereka mungkin memerlukan perubahan desain langsung. Abstraksi hanya berguna dalam konteks stabilitas ini jika sesuatu, dengan menjadi abstrak, mengurangi kemungkinan itu.
Untuk banyak konteks yang mungkin terjadi dengan insinyur dan klien yang layak yang mengantisipasi kebutuhan perangkat lunak dimuka dan desain stabil (seperti dalam, tidak berubah) abstraksi, sementara abstraksi itu menawarkan semua ruang bernapas yang mereka butuhkan untuk menukar implementasi konkret. Tetapi dalam beberapa domain, abstraksi mungkin tidak stabil dan cenderung tidak memadai, sedangkan data yang dibutuhkan mesin mungkin jauh lebih mudah untuk diantisipasi dan dibuat stabil terlebih dahulu. Jadi dalam kasus-kasus itu, sebenarnya bisa lebih menguntungkan dari sudut pandang rawatan (kemudahan mengubah dan memperluas sistem) agar ketergantungan mengalir ke data daripada abstraksi. Dalam ECS, bagian yang paling tidak stabil (seperti bagian yang paling sering diubah) biasanya adalah fungsi yang berada di sistem (PhysicsSystem
, misalnya), sedangkan bagian yang paling stabil (seperti yang paling tidak mungkin diubah) adalah komponen yang hanya terdiri dari data mentah ( MotionComponent
, misalnya) yang digunakan semua sistem.