Arsitektur Modular untuk Memproses Pipa


8

Saya mencoba mendesain arsitektur sistem yang akan saya implementasikan dalam C ++, dan saya bertanya-tanya apakah orang bisa memikirkan pendekatan yang baik, atau mengkritik pendekatan yang telah saya rancang sejauh ini.

Pertama-tama, masalah umum adalah pipa pemrosesan gambar. Ini berisi beberapa tahap, dan tujuannya adalah untuk merancang solusi yang sangat modular, sehingga setiap tahap dapat dengan mudah diganti dan diganti dengan sepotong kode khusus (sehingga pengguna dapat memiliki peningkatan kecepatan jika dia tahu bahwa tahap tertentu dibatasi dengan cara tertentu dalam masalahnya).

Pemikiran saat ini adalah sesuatu seperti ini:

struct output; /*Contains the output values from the pipeline.*/

class input_routines{
    public:
    virtual foo stage1(...){...}
    virtual bar stage2(...){...}
    virtual qux stage3(...){...}
    ...
}

output pipeline(input_routines stages);

Ini akan memungkinkan orang untuk subkelas input_routines dan menimpa tahap apa pun yang mereka inginkan. Yang mengatakan, saya telah bekerja dalam sistem seperti ini sebelumnya, dan saya menemukan subclass dan hal-hal standar cenderung menjadi berantakan, dan bisa sulit untuk digunakan, jadi saya tidak pusing tentang menulis satu sendiri. Saya juga memikirkan pendekatan yang lebih STLish, di mana tahapan yang berbeda (ada 6 atau 7) akan menjadi parameter template default.

Adakah yang bisa menawarkan kritik terhadap pola di atas, pemikiran tentang pendekatan templat, atau arsitektur lain yang muncul di pikiran?


1
Apakah Anda yakin tidak ingin menggunakan bahasa Lisp-family untuk jenis proyek ini?
Pekerjaan

Oh, saya pasti ingin menggunakan bahasa keluarga Lisp untuk proyek ini, tragisnya, saya menambahkan fungsionalitas ke pustaka pencitraan C ++ yang ada.
anjruu

Jawaban:


2

Desainnya sangat tergantung pada apa yang sebenarnya dilakukan oleh berbagai tahap. Saya lebih suka fungsi virtual murni daripada fungsi virtual non-murni (kelas abstrak).

Tahapan umum dapat dikelompokkan bersama dalam subkelas abstrak. Dengan berasal dari kelas abstrak utama Anda masih dapat menyesuaikan setiap tahap, tetapi dengan berasal dari subkelas Anda dapat menggunakan kembali perilaku yang sudah ada yang sudah ditulis. Itu cenderung kurang berantakan, seperti yang Anda sebutkan untuk metode virtual.

Jika tahapan yang berbeda juga bisa ada sendiri (di luar seluruh pipa), pertimbangkan juga menulis kelas untuk memisahkan perilaku ini.


2

Mungkin membuat daftar functors di pabrik, yang mengimplementasikan tahapan. Kode semu:

functorFactory() {
  return [ foo(), bar(), baz() ]
}

Pengguna dapat menerapkan kembali pabrik atau hanya memanipulasi daftar fungsi. Kode semu

myFactory() {
  return [ foo(), myBar() ]
}

atau

myFactory() {
  return functorFactory()[2] = myBar()
}

Ketika pengaturan selesai, Anda dapat memanggil masing-masing functor menggunakan hasil yang terakhir.


+1: ini memberikan fleksibilitas maksimum, karena pengguna diizinkan untuk benar-benar menambahkan langkah / menghapus langkah jika mereka menginginkannya.
Matthieu M.

1
Itu terlihat hebat, tetapi bagaimana saya mengimplementasikan ini di C ++? Saya tidak dapat memiliki array pointer fungsi, karena setiap pointer fungsi akan memiliki tipe yang berbeda jika fungsinya mengembalikan hal yang berbeda, dan array hanya dapat menampung objek dari tipe yang sama. Terima kasih!
anjruu

0

Lihatlah Monads seperti yang diterapkan di Haskell, yang mungkin memberi Anda ide bagus tentang cara mengatur berbagai hal. Haskell membuat hal semacam ini benar.


0

Saya akan mendefinisikan tipe Intermediate. Semua gambar akan dikonversi ke format ini; setiap tahap akan mengambil Intermediate dan mengembalikan Intermediate - tidak yang sama, yang baru.

Sebuah panggung akan seperti ini:

Intermediate DoSomething(const Intermediate &i);

Saya biasanya menghindari solusi berbasis warisan pada umumnya kecuali mereka adalah peta yang cukup jelas ke masalah, misalnya, objek di dunia 3D.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.