2015-07-07 2 views
-1

Каков наилучший способ сделать этот фрагмент более ориентированным на объект?Повелительный стиль ООП - сниппет

public class Formatter { 

    private Service service; 

    public Formatter(Service service) { 
     this.service = service; 
    } 

    public String doTheJob(String theInput) { 
     String response = service.askForPermission(); 
     switch (response) { 
     case "FAIL": 
      return "error"; 
     case "OK": 
      return String.format("%s%s", theInput, theInput); 
     default: 
      return null; 
     } 
    } 
} 
+0

ориентация объекта является метод, а не цель – reaanb

+0

@reaanb Это может полностью быть целью. «Как применить ориентацию объекта к этому коду» - это не странный вопрос. Этот вопрос, однако, слишком широк для StackOverflow. –

+0

Зачем вам нужно менять код? Это кажется довольно простым и, разумеется, не нужно быть «более объектно ориентированным». – Orch

ответ

0

Если ваш код не должен быть более сложным, вы ничего не должны менять.

Но если вы пишете пример принципа, я думаю, что это хороший пример, где можно использовать шаблон «Factory/Delegation». Принцип заключается в создании класса с классом children для всех ваших случаев. Затем вы регистрируете все случаи и используете метод, чтобы выбрать, какой хороший класс использовать с вашим ответом. С помощью этого метода вам не нужно использовать переключатель/case, который «не очень ориентирован на объекты» для пуристов.

Ваш код может быть что-то со следующим принципом (будьте осторожны, это просто код, чтобы проиллюстрировать принцип):

abstract class Job { 
    public abstract String doTheJob(String theInput); 
} 

class FailJob extends Job { 
    public String doTheJob(String theInput) { 
     return "error"; 
    } 
} 

class OKJob extends Job { 
    public String doTheJob(String theInput) { 
     return String.format("%s%s", theInput, theInput); 
    } 
} 

class NullJob extends Job { 
    public String doTheJob(String theInput) { 
     return null; 
    } 
} 


class Formatter { 
    private Service service; 
    private Map<String, Job> jobs; 

    public Formatter(Service service) { 
     this.service = service; 

     // init the jobs 
     jobs = new HashMap<String, Job>(); 
     jobs.put("FAIL", new FailJob()); 
     jobs.put("OK", new OKJob()); 
    } 

    public String doTheJob(String theInput) { 
     String response = service.askForPermission(); 
     Job job = getTheJob(response); 
     return job.doTheJob(theInput); 
    } 

    private Job getTheJob(String response) { 
     Job job = jobs.get(response); 
     if(job == null) { 
      job = new NullJob(); 
     } 

     return job; 
    } 
} 

Но, опять же, если ваш код все, что вам нужно сделать, застрял это проще.

0

Ваш вопрос не типичный StackOverflow-Answer, так как он запрашивает «мнение». Рассмотрите возможность размещения на Code Review для получения более качественных ответов.

Тем не менее: я бы предложил эти изменения.

  1. Не используйте тип возврата для отсутствующих разрешений, но относиться к ним с использованием исключений. Это сделает ваш код короче и больше ориентирован на функциональность, чем на технические аспекты, такие как разрешения.
  2. В качестве параметра используйте Суперкласс Object. Это сделает ваш API более удобным - без каких-либо дополнительных затрат, так как String.format execpts Объекты как параметры в любом случае.
  3. Последнее и наименее: Используйте значащие имена. Service не говорит всем, для чего предназначен этот класс. Подумайте о том, как реорганизовать его на PermissionChecker или, возможно, даже на что-то более конкретное. Это поможет другим понять ваш код и найти соответствующие коды.

Полученный код может выглядеть следующим образом:

public class Formatter { 

    private PermissionChecker permissionChecker; 

    public Formatter(PermissionChecker permissionChecker) { 
     this.permissionChecker = permissionChecker; 
    } 

    public String doTheJob(Object theInput) { 

     // check permission, fail with exception, if something goes wrong 
     permissionChecker.assertFormattingPermission(); 

     return String.format("%s%s", theInput, theInput); 
    } 
} 
Смежные вопросы