Upgrade to Pro — share decks privately, control downloads, hide ads and more …

클린소프트웨어 8주차 사내 발표자료

JungWon2
November 01, 2017
910

클린소프트웨어 8주차 사내 발표자료

JungWon2

November 01, 2017
Tweet

Transcript

  1. 비지터 패턴 ConfigureForUnix 메소드를 Modem 인터페이스에 추가하지 않고 어떻게 환경

    설정할 수 있을까? 이중 디스패치(dual dispatch)를 사용하자. => 비지터
  2. public class ZoomModem implements Modem { … public void accept(ModemVisitor

    v) { v.visit(this); } … } public class UnixModemConfigurator implements ModemVisitor { public void visit(HayesModem m) { m.configurationString = “&s1=4&D=3”; } public void visit(ZoomModem m) { m.configurationValue = 42; } public void visit(ErnieModem m) { m.internalPattern = “C is too slow”; } } Function overloading ㅎ
  3. public interface HayesModemVisitor { public void visit(HayesModem m); } public

    class UnixModemConfigurator implements ModemVisitor, ErnieModemVisitor, HayesModemVisitor, ZoomModemVisitor { public void visit(HayesModem m) { m.configurationString = "&s1=4&d3"; } public void visit(ZoomModem m) { m.configurationValue = 42; } public void visit(ErnieModem m) { m.internalPattern = "C is too slow"; } } 의존 관계 순환이 깨지고 새로운 방문 대상 파생형을 추가하거나 점진적 컴파일이 쉬워진다. - 단점 : 훨씬 복잡해
  4. public class ExplodedCostVisitor implements PartVisitor { private double cost =

    0; public double cost() { return cost; } Public void visit(PiecePart p) { cost += p.getCost(); } ….. } public class Assembly implements Part { public void accept(PartVisitor v) { v.visit(this); Iterator I = getParts(); while(i.hasNext()) { Part p = (Part)i.next(); p.accept(v); } } … }
  5. 데코레이터 패턴 기존 계층 구조를 바꾸지 않고 메소드를 추가하는 비지터

    말고 다른 패턴 Hayes 모뎀에 볼륨을 높여주세요. … Modem m = user.getModem(); If(user.wantsLoudDial()) m.setVoume(11); m.dial(…) … … Public class HasyesModem impements Modem { private Boolean wantsLoudDial = false; public void dial(…) { if(wantsLoudDial) setValume(11); } } 그냥 Hayes모뎀을 안건드리고, 안돼? OMG...
  6. public class HayesModem implements Modem { … public void dial(String

    pno) { itsPhoneNumber = pno; } private String itsPhoneNumber; … } public class LoudDialModem implements Modem { … public void dial(String pno) { itsModem.setSpeakerVolume(10); itsModem.dial(pno); } … private Modem itsModem; }
  7. public abstract class Part { HashMap itsExtensions = new HashMap();

    public void addExtension(String extensionType, PartExtension extension) { ..… } public PartExtension getExtension(String extensionType) { ..… } } public class CSVPiecepartExtension implements CSVPartExtension { public String getCSV() { StringBuffer b = new StringBuffer(“Piecepart,”); b.append(itsPiecePart.getpartNumber()); …. Return b.toString(); } } public class CSVAssemblyExtension implements CSVPartExtension { public String getCSV() { StringBuffer b = new StringBuffer(“Assembly,”); b.append(itsPiecePart.getpartNumber()); …. Iterator I = itsAssembly.getParts(); while(i.hasNext()) { Part p = (Part)i.next(); CSVPartExtension ce = (CSVPartExtension) p.getExtenstion(“CSV”); b.append(“,{“); b.append(ce.getCSV()); …. } return b.toString(); } }
  8. 중첩된 switch/case문 public class Tunstile { … public void event(int

    event) { switch(state){ swtich(event) { case COIN: state = UNLOCKED; turnstileController.unlock(); break; case PASS: ….. /* 전용 */ public state = LOCKED; public testCointInUnlockedState() { t.state = Turnstile.UNLOCKED; …. } 자바의 약점!!! 장점 : 명쾌 단점 : 복잡
  9. c++의 내가 메모리풀을 만들껀데, 그 객체는 메모리풀에서만 가져와야 하니, 딴데서

    생성 못했으면 좋겠어 Quiz class MonsterPool { Monster pool_[1000]; public: Monster& Factory(){....} };
  10. c++의 class Monster { friend class MonsterPool; private: Monster(){} };

    내가 메모리풀을 만들껀데, 그 객체는 메모리풀에서만 가져와야 하니, 딴데서 생성 못했으면 좋겠어 class MonsterPool { Monster pool_[1000]; public: Monster& Factory(){....} };
  11. 스테이트 패턴 public class Turnstile { private static TurnstileState lockedState

    = new LockedTurnStileState(); private static TurnstileState unlockedState = new UnLockedTurnStileState(); private TurnstileState state = lockedState; ….
  12. 상태기계 컴파일러(State Machine Compiler) public class Tunstile extends TurnStileActions {

    … private static Locked itsLockedState; private static Unlocked itsUnlockedState; … private State itsState; …. public void coin() throws FSMError { itsState.Coin(); } } public class Unlocked extends State { … public void coin() { thankyou(); } } 3차원 유한상태 기계(3D???) (THREE-LEVEL FINITE STATE MACHINE)