簡體   English   中英

如何使我的課程與平台無關?

[英]How can I make my classes more platform-independent?

我有個問題。 我編寫了一個GPS模塊,該模塊可以實時檢測消息的類型並根據需要進行配置。 我已經完成了幾個班級的學習。 為了使代碼更獨立於平台(stm32),我創建了一個具有基礎i / o操作的IStreamDevice接口。 有用。 一切似乎都很棒,但是這些班級顯然是耦合的。 這就是為什么我有幾個問題:

  1. 如何避免將IStreamDevice傳遞給所有設備?
  2. 如何使整個設計與平台無關(和與操作系統無關)? 我們計划在不遠的將來遷移到另一個操作系統。 它符合POSIX。 我想我可以在那里實現IStreamDevice接口(我可以使用的總線是UART和SPI。在當前版本中,我僅使用UART)。 我錯了嗎?

      class IStreamDevice { public: virtual ~IStreamDevice() {} virtual uint32_t read(uint8_t* data, uint32_t size) = 0; virtual uint32_t write(const uint8_t* data, uint32_t size) = 0; virtual uint32_t bytesToRead() const = 0; virtual uint32_t bytesToWrite() const = 0; }; class GPSModule { public: GPSModule(periph::IStreamDevice *source); ~GPSModule(); void turnDevice1Messages(); void turnDevice2Messages(); void configureDevice1(...); void configureDevice2(...); void Scan(); private: Device1Configurator *_device1_configurator; Device2Configurator *_device2_configurator; StreamDeviceScanner*_scanner; periph::IStreamDevice *_source; }; GPSModule::GPSModule(periph::IStreamDevice *source): _source(source) { _scanner= new StreamDeviceScanner(_source); _device1_configurator = new Device1Configurator(_source); _device2_configurator = new Device2Configurator(_source); } GPSModule::~GPSModule() { delete _scanner; } void GPSModule::Scan() { _scanner->Scan(); } void GPSModule::turnDevice1Messages() { _device1_configurator->turnMessages(); } class StreamDeviceScanner{ public: StreamDeviceScanner(periph::IStreamDevice *source); ~StreamDeviceScanner(); void Scan(); private: typedef enum { WAITING_SYNC, WAITING_DEVICE1_MSG, WAITING_DEVICE2_MSG } states_t; periph::IStreamDevice *_source; ProtocolScanner *_protocol_scanner; states_t _state; private: states_t _catchSync(); uint32_t _read(uint8_t* data, uint32_t length) { return _source->read(data,length); } uint32_t _bytesToRead() const { return _source->bytesToRead(); } }; StreamDeviceScanner::StreamDeviceScanner(periph::IStreamDevice *source): _source(source), _state(WAITING_SYNC) { _protocol_scanner = new ProtocolScanner(source); } StreamDeviceScanner::~StreamDeviceScanner() { delete _protocol_scanner; } void StreamDeviceScanner::Scan() { while (_source->bytesToRead()) { switch (_state) { case WAITING_SYNC: _state = _catchSync(); break; case WAITING_DEVICE1_MSG: _protocol_scanner->Device1Scan() _state = WAITING_SYNC; break; case WAITING_DEVICE2_MSG: _protocol_scanner->Device2Scan() _state = WAITING_SYNC; break; } } } class ProtocolScanner { private: Device1Scanner *_Device1Scanner; Device2Scanner *_Device2Scanner; public: ProtocolScanner(periph::IStreamDevice *source) { _Device1Scanner = new Device1Scanner(source); _Device2Scanner = new Device2Scanner(source); } ~ProtocolScanner() { delete _Device1Scanner; delete _Device1Scanner; } bool Device1Scan() const { return _Device1Scanner->Scan(); } bool Device2Scan() const { return _Device2Scanner->Scan(); } }; class Device1Scanner { public: Device1Scanner(periph::IStreamDevice *source); ~Device1Scanner(); bool Scan(); private: enum { BUFFER_LENGTH = 8192 }; typedef enum { Waiting_Header, Waiting_Payload, Waiting_Checksum } state_t; uint8_t _buffer[BUFFER_LENGTH]; periph::IStreamDevice *_source; state_t _state; Device1Parser *_destination; Device1Scanner::NovatelMessage _message; private: uint32_t _read(uint8_t* data, uint32_t size) { return _source->read(data,size); } const uint32_t _bytesToRead() const { return _source->bytesToRead(); } bool _receiveHeader(); bool _receivePayload(); bool _receiveChecksum(); bool _validChecksum() const; }; 

    Device2Scanner看起來完全一樣。 我想聽聽任何人對設計的所有評價。

我認為您的設計沒有任何固有的問題。 您的IStreamWriter接口似乎是對基礎總線的適當抽象,而不必依賴於特定的總線詳細信息。 這符合“依賴倒置”原則和按合同設計方法。 我也看不到你們班上的緊密聯系。 您將根據接口規范通過其處理程序訪問總線,而不依賴於實際總線處理類的實現。

顯示的代碼中沒有任何平台依賴。 如果每個平台的總線處理都不同,則除了根據平台為IStreamWriter提供不同的實現之外,您IStreamWriter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM