Ada banyak pendekatan yang valid untuk menyelesaikan masalah Anda. Basile Starynkevitch mengusulkan pendekatan "nol-birokrasi" yang membuat Anda memiliki antarmuka yang sederhana dan mengandalkan programmer yang menggunakan antarmuka dengan tepat. Sementara saya suka pendekatan ini, saya akan menyajikan satu lagi yang memiliki lebih banyak eingineering tetapi memungkinkan kompiler untuk menangkap beberapa kesalahan.
Mengidentifikasi berbagai negara perangkat Anda dapat di, sebagai Uninitialised
,
Started
, Configured
dan sebagainya. Daftarnya harus terbatas.¹
Untuk setiap negara, tentukan struct
holding informasi tambahan yang diperlukan yang relevan dengan negara itu, misalnya DeviceUninitialised
,
DeviceStarted
dan sebagainya.
Kemas semua perawatan dalam satu objek di DeviceStrategy
mana metode menggunakan struktur yang ditentukan dalam 2. sebagai input dan output. Dengan demikian, Anda mungkin memiliki DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)
metode (atau apa pun yang setara mungkin sesuai dengan konvensi proyek Anda).
Dengan pendekatan ini, program yang valid harus memanggil beberapa metode dalam urutan yang diberlakukan oleh prototipe metode.
Berbagai negara adalah objek yang tidak terkait, ini karena prinsip substitusi. Jika berguna bagi Anda untuk memiliki struktur ini memiliki leluhur yang sama, ingatlah bahwa pola pengunjung dapat digunakan untuk memulihkan tipe konkret dari instance kelas abstrak.
Sementara saya jelaskan dalam 3. DeviceStrategy
kelas yang unik , ada situasi di mana Anda mungkin ingin membagi fungsionalitas yang disediakannya di beberapa kelas.
Untuk meringkasnya, poin-poin utama dari desain yang saya jelaskan adalah:
Karena prinsip substitusi, objek yang mewakili status perangkat harus berbeda dan tidak memiliki hubungan pewarisan khusus.
Kemas perawatan perangkat di objek pemula daripada objek yang mewakili perangkat itu sendiri, sehingga setiap perangkat atau negara perangkat hanya melihat dirinya sendiri, dan strategi melihat semuanya dan mengekspresikan kemungkinan transisi di antara mereka.
Saya bersumpah bahwa saya pernah melihat deskripsi implementasi klien telnet mengikuti baris-baris ini, tetapi saya tidak dapat menemukannya lagi. Itu akan menjadi referensi yang sangat berguna!
¹: Untuk ini, ikuti intuisi Anda atau temukan kelas metode ekuivalen dalam implementasi aktual Anda untuk relasi “metode₁ ~ metode₂ iff. valid untuk menggunakannya pada objek yang sama ”- dengan asumsi Anda memiliki objek besar yang merangkum semua perawatan pada perangkat Anda. Kedua metode daftar negara memberikan hasil yang fantastis.
discovery
atauhandshake
?