ООП избегайте ненужных повторных вызовов

#class #oop

Вопрос:

поэтому у меня есть вопрос о дизайне класса ООП. Я читал, что мы должны «Говорить, не спрашивайте» и не использовать исключения для «Управления потоком». Однако в данном конкретном случае я вижу, что выполняется некоторый избыточный код!

Предположим, у человека есть список мероприятий, которые он будет посещать, и необходимо обеспечить, чтобы он не мог присутствовать на мероприятии, которое совпадает с его текущим расписанием. Итак, у меня есть следующий Java-код

 public class Person {  // this arraylist of events must not have overlapping events!  ArrayListlt;Eventsgt; eventsToAttend;   // checks if a person is free to attend a new event by viewing all events he is attending  public boolean canAttendEvent(Event newEvent) {  for(int i = 0; i lt; eventsToAttend.size(); i  ) {  if (newEvent.isSameDayAndTime(eventsToAttend.get(i))) {  return false;  }  }   return true;  }   public void attendEvent(Event newEvent) {  // enforce the validity of the newEvent  if (!canAttendEvent(newEvent)) {  // throw exception and return  }  eventsToAttend.add(newEvent);  }   public static main(String[] args) {  // just an example usage!  Person person = somePersonWithEventsAlready;  Event event = new Event();  if (person.canAttendEvent(event)) {  // !!!  // Notice that canAttendEvent() is called twice!! how do you prevent this?  // !!!  person.attendEvent(event);  }   // Alternatively I could just try - catch around person.attendEvent(), but is that bad practise?  } }  

Проблема, с которой я сталкиваюсь в целом при таком способе ведения дел, заключается в том, что «canAttendEvent()» вызывается дважды. Однако это хорошая практика в соответствии с шаблонами проектирования ООП?

Что было бы лучшим способом сделать что-то подобное? Спасибо, что прочитали это.

Ответ №1:

попробуйте — поймайте в основном лучший способ достичь того, чего вы пытаетесь избежать: дважды вызовите функцию canAttendEvent

Комментарии:

1. Хорошо, как вы думаете, метод try-catch лучше или оставить все как есть прямо сейчас?