Как выбрать классы в ООП?
===========================

 Здравствуйте.  

  

Во всех учебных пособиях по ООП приводятся простые и понятные примеры классов вроде стиральной машины и вещей, машина может стирать вещи. Обе абстракции не связаны друг с другом, все понятно.  

  

На практике у меня есть запрос, который содержит список устройств и список команд, которые надо выполнить на устройствах.  

[  

 {'device\_name': 'device1', 'commands': ['sh run']},  

 {'device\_name': 'device2', 'commands': ['sh run', 'sh ip int brie']}  

]  

В качестве класса я выбрал device и добавил ему свойство commands\_to\_execute куда поместил список команд.  

Но в реальном мире устройства и команды это разные сущности и тогда нужно создать классы device и command, но я не понимаю как тогда красиво связать их, ведь мне нужно выполнить определенные команды на определенных устройствах.  

  

Как быть в подобной ситуации? 

 Вообще, здесь все зависит от того, что конкретно делает ваша система и будет ли у нее развитие.  

  

Но, если мыслить объектно, то устройство - это то, чему на вход подают некую команду, он ее выполняет и отдает ответ. Соответственно, вам нужна реализация Device, которая через метод execute(Executable command) принимает объект, который реализует интерфейс Executable. А список команд уже никакого отношения к устройству не имеет, поэтому и хранится должен отдельно. 

 Всё упирается в Вашу фантазию, как и в учебниках по программированию.  

Здесь можно выделить множество классов:  

1. класс Array, который содержит список девайсов или команд  

2. класс Device, который отображает сущность девайса и содержит список команд  

3. класс Command, который отображает сущность команды  

  

примерная имплементация:  

```
class Device {
  name: String
  commands: Array<Command>
}
class Command {
  shell: String
}
```
  

Сюда можно зафигачить accessor methods для доступа к данным или другую муть, которую захотите 

 Почитай что такое Композиция и Агрегация в ООП, многое поймёшь.