2015-05-14 10 views
3

Здравствуйте, я написал код для получения данных с помощью pySerial, как показано ниже.
Мой класс зависит от серийного класса, который не соответствует правилу «свободной связи».
Должен ли я использовать интерфейс для развязки своего класса?
Большое спасибо за инструкцию.Каков правильный способ «развязать связь» в python?

import serial 

class ArduinoConnect: 

    def __init__(self): 
     pass 

    def serial_connect(self, serial_port, serial_baudrate): 

     self._serial_port = serial_port 
     try: 
      self.ser = serial.Serial(
       port=self._serial_port, 
       baudrate=serial_baudrate, 
       parity=serial.PARITY_NONE, 
       stopbits=serial.STOPBITS_ONE, 
       bytesize=serial.EIGHTBITS, 
      ) 
     except serial.serialutil.SerialException, e: 
      print str(e) 

    def serial_disconnect(self): 
     self.ser.close() 

    def get_quaternion(self, number_of_data=50): 

     buff = [] 
     self.ser.write('q') 
     self.ser.write(chr(number_of_data)) 
     for j in range(number_of_data): 
      in_string = self.ser.readline() 
      buff_line = in_string.split(",") 
      buff_line.pop() 
      buff_line = self.hex_to_quaternion(buff_line) 
      buff.append(list(buff_line)) 
     return buff 

    def hex_to_quaternion(self, list_of_hex=None): 
     #...... 
     pass 

arduino = ArduinoConnect() 
arduino.serial_connect(serial_port="COM5", serial_baudrate=115200) 
print arduino.get_quaternion() 
arduino.serial_disconnect() 

Я настроил свой код в соответствии с рекомендациями.
DI помогает отделить последовательный процесс, а заводский метод помогает инкапсулировать процесс DI.
Есть ли что-нибудь еще, что я мог бы сделать, чтобы встретить правило «свободной связи»?
Спасибо за помощь.

import serial 

class ArduinoConnect: 
    def __init__(self, serial_to_arduino): 
     self._serial_to_arduino = serial_to_arduino 

    def get_quaternion(self, number_of_data=50): 
     buff = [] 
     self._serial_to_arduino.write('q') 
     self._serial_to_arduino.write(chr(number_of_data)) 
     for j in range(number_of_data): 
      in_string = self._serial_to_arduino.readline() 
      buff_line = in_string.split(",") 
      buff_line.pop() 
      buff_line = self.hex_to_quaternion(buff_line) 
      buff.append(list(buff_line)) 
     return buff 

    def hex_to_quaternion(self, list_of_hex): 
     ...... 

    def __getattr__(self, attr): 
     return getattr(self._serial_to_arduino, attr) 


class SerialToArduino: 
    def __init__(self): 
     pass 

    def serial_connect(self, serial_port="COM5", serial_baudrate=115200): 
     self._serial_port = serial_port 
     try: 
      self.ser = serial.Serial(
       port=self._serial_port, 
       baudrate=serial_baudrate, 
       parity=serial.PARITY_NONE, 
       stopbits=serial.STOPBITS_ONE, 
       bytesize=serial.EIGHTBITS, 
      ) 
     except serial.serialutil.SerialException, e: 
      print str(e) 

    def serial_disconnect(self): 
     self.ser.close() 

    def readline(self): 
     return self.ser.readline() 

    def write(self, data): 
     self.ser.write(data=data) 


def get_ArduinoConnect(): 
    'factory method' 
    return ArduinoConnect(serial_to_arduino=SerialToArduino()) 


arduino = get_ArduinoConnect() 
arduino.serial_connect(serial_port="COM5", serial_baudrate=115200) 
print arduino.get_quaternion() 
arduino.serial_disconnect() 

ответ

3

я могу думать о 2 возможных решений

  1. Реализовать «адаптер» разоблачать методы к основному классу и скрыть реализацию последовательной. Так что ваш главный класс может избежать зависимости от конкретного класса Последовательная
  2. Do Dependency Injection, что-то любит этот

    четкости serial_connect (самость, двигатель, serial_port, serial_baudrate)

Обновление 1 : Я ссылался на http://en.wikipedia.org/wiki/Adapter_pattern, который обычно используется, когда вы хотите отделить конкретную реализацию от абстракции. Подумайте об этом как переходнике пробки.

Это особенно полезно для языка, такого как Java, со строгим интерфейсом и всем остальным. В вашем случае, потому что в Python мы не имеем «интерфейс», вы можете моделировать его, используя абстрактный класс

class AbstractAdapter(): 
     def serial_connect(self, serial_port="COM5", serial_baudrate=115200): 
      raise("Needs implementation") 
     # do the same thing for the rest of the methods 

Тогда в ArduinoConnect, вы можете проверить тип

def __init__(self, serial_to_arduino): 
    if not isinstance(serial_to_arduino, AbstractAdapter): 
     raise("Wrong type") 

Этот заставляет ваш serial_to_arduino продлить AbstractAdapter, который обеспечивает реализацию всех абстрактных методов, следовательно, адаптера.

Это может быть не самый «вещий» способ делать вещи, но с ООП точки зрения, вы можете сделать это таким образом, чтобы иметь самый высокий уровень слабой связи (на мой взгляд)

P/s: На самом деле, я думаю, что правильная модель в этом случае должна быть Стратегией, оба они очень похожи в плане реализации, но они предназначены для разных целей. Вы можете прочитать больше о некоторых шаблонах, таких как Strategy, Proxy, Command, Mediator, которые часто используются для достижения свободной связи.

+0

Можете ли вы подробнее остановиться на 1? –

+0

Обновлен ответ, так как раздел комментариев слишком мал для него –

Смежные вопросы