Inilah masalah saya: Saya ingin membaca input dari berbagai perangkat HID seperti gamepad, racing well, joystick, dll. Cukup banyak pengendali permainan apa pun. Masalahnya adalah mereka semua memiliki input yang berbeda.
Gamepad memiliki tombol, sakelar, dan stik, sementara arena balap mungkin memiliki stik gigi. Saya berhasil mengabstraksikan semua komponen yang berbeda ini menjadi hanya 3 jadi alih-alih memiliki kelas dasar dengan semua kemungkinan kombinasi:
abstract class Device
{
public Buttons Buttons;
public Axes Axes;
public Switches Switches;
public GearSticks GearSticks;
//many more
}
Sekarang saya dapat memiliki:
abstract class Device
{
public Buttons Buttons; //on or off
public Axes Axes; //range [-100%:100%]
public Switches Switches; //multiple states
}
Pada awalnya saya senang dengan ini karena tampaknya mencakup semua jenis input yang mungkin dan sehingga kelas saya bisa tetap tertutup sementara terbuka untuk ekstensi melalui semua implementasi konkret karena semuanya dapat diabstraksi menjadi hanya 3 jenis input.
TETAPI kemudian saya berpikir sendiri bagaimana jika saya hanya menunda hal yang tak terhindarkan? Bagaimana jika suatu hari saya harus menambahkan bidang lain ke Device
kelas saya ? Itu tidak mendukung sesuatu seperti trackball!
Apakah ada cara saya bisa membuktikan kelas ini di masa depan? Cara saya melihatnya saya akan berakhir dengan sesuatu seperti ini:
public Device1 : Device
{
//buttons
//trackball
}
public Device2 : Device
{
//Switch
//Axis
}
public Device3 : Device
{
//trackball
//switch
}
Dan saya harus terus menambahkan properti ke kelas dasar saya setiap kali ada sesuatu yang baru untuk diterapkan.
sumber
parameter1=value1¶meter2=value2
dll.Jawaban:
Saya cukup yakin ini dapat dilakukan dengan memperkenalkan konsep seperti abstrak
InputChannel
, dan perangkat memiliki daftar saluran input yang dapat dikonfigurasi. Saluran input akan memiliki nama, tipe, mungkin beberapa data meta, dan harus dapat menghasilkan beberapa "keadaan" yang cocok dengan tipe itu. Mungkin ada saluran yang sudah ditentukan sebelumnya seperti tombol, kapak atau sakelar, atau beberapa saluran baru yang saat ini tidak Anda kenal (tetapi mungkin ditambahkan kemudian dengan memperkenalkanInputChannel
kelas anak baru ).Dengan cara ini, perangkat akan menjadi semacam model meta, dan Anda juga akan membutuhkan cara untuk mengelola status perangkat, yang harus sesuai dengan daftar saluran input perangkat.
Namun, pendekatan generik semacam itu memiliki risiko overengineering, juga dikenal sebagai efek Inner-platform . Misalnya, mungkin tidak mudah untuk menambahkan fungsionalitas spesifik ke perangkat generik, atau peristiwa tertentu, atau interaksi antara saluran input yang berbeda. Mungkin juga lebih sulit untuk menggunakan dan memahami bagi pengguna perpustakaan perangkat generik Anda.
Perhatikan bahwa tidak selalu bermanfaat untuk membuat solusi yang paling abstrak. Mengubah persyaratan dalam perangkat keras biasanya memerlukan lebih banyak upaya untuk diimplementasikan dalam perangkat keras itu sendiri daripada dalam perangkat lunak yang sesuai, sehingga seringkali lebih baik tetap menggunakan solusi yang lebih spesifik dalam perangkat lunak, dan mengubah perangkat lunak bila diperlukan.
sumber
InputChannel
pekerjaan bisa, semua saya membutuhkannya untuk lakukan adalah untuk memperbarui negara itu dan menaikkanonChangedEvent
. Tapi Anda mungkin benar tentang rekayasa berlebihan ... Saya akan mengingat ini. Apakah Anda pikir menambahkan bidang lain ke kelas setiap saat dapat diterima?Gagasan di balik prinsip buka-tutup adalah bahwa Anda lebih kecil kemungkinannya untuk merusak fungsionalitas yang ada jika Anda menerapkan fungsionalitas baru melalui pewarisan alih-alih modifikasi kelas yang ada. Dan Anda dapat melakukannya, dengan mewarisi dari Hid Anda. Dalam satu tahun dan beberapa bulan Anda dapat membuat Hid2020 yang mewarisi dari Hid dan menambahkan dukungan untuk trackball yang akan ditemukan pada Q4 tahun 2019. Setelah penemuan dan mempopulerkan detektor squeeze pada tahun 2023 Anda dapat membuat kelas Hid2024 yang turun dari Hid2019.
Itu akan menjadi pendekatan defensif. Tetapi juga akan sedikit ceroboh dari perspektif desain yang bersih. Dalam kasus Anda, saya tidak akan kehilangan tidur karena melanggar O dan hanya mengubah kelas dasar sebagai dunia di sekitar Anda berubah. Sepertinya penerapan trackball atau jenis kontrol baru lainnya tidak akan berdampak pada cara Anda menangani penekanan tombol atau mengganti perubahan status sekarang.
sumber