개발/프로그래밍
-
[오브젝트 - 5 ] 상속과 상속의 문제점, 합성개발/프로그래밍 2022. 7. 18. 21:41
이미 존재하는 클래스와 유사한 클래스가 필요 하다면 코드를 복사하지 말고 상속을 이용해 재사용하면 된다. 상속과 결합도 코드를 쉽게 재사용할수 있는 상속은 좋은 방법일까? 자식 클래스 작성자는 부모클래스 구현 방법에 대한 정확한 지식을 가져야한다. 따라서 상속은 자식과 부모 클래스의 결합도를 높인다. 부모의 변경에 자식은 취약하다. 또한 불필요한 인터페이스를 상속 받게되는 문제가 생기게 되며 오버라이드 함수가 오작동할수있다. override func add(t: T) { addCount += 1 return super.add(t) } override func addAll(t: [T]) { addCount += t.count return super.addAll(t) } super.add() 내부에서 다른 ..
-
[오브젝트 - 4 ] 개방 폐쇄 원칙과 의존성개발/프로그래밍 2022. 6. 11. 16:01
new연산자 new연산자는 인스턴스를 생성할때 사용한다. 그러나 인스턴스 생성시 추상클래스가 아닌 구체클래스를 직접 결합해 사용(의존)하며 생성시 필요한 인자값도 넣어줘야하므로 클라이언트 입장에서 지식양이 늘어난다. class Movie { private let discountPolicy:DiscountPolicy init(title:String, runningTime:Duration, fee:Movie) { self.discountPlicy = AmountDiscountPolicy(Money.wons(800), SequenceCondition(1),PeriodCondition(DayOfWeek.Monday),PeriodCondition(DayOfWeek.Thursday)) } } 위와같이 Movie클래..
-
[오브젝트 - 3] 인터페이스 추상화개발/프로그래밍 2022. 6. 1. 17:11
인터페이스 최소한의 인터페이스와 추상적인 인터페이스를 만족하라 꼭 필요한 오퍼레이션(다른객체에 제공하는 추상적인 서비스) 만 인터페이스에 넣어주고 어떻게가 아닌 무엇을 하는지(추상적) 표현한다. 디미터 법칙 “낯선자에게 말하지 말라", 객체 내부 구조에 강한 결합을 하지 않도록 협력 경로를 제한하는것이다. 협력대상은 아래와같이 제한한다 1. this 2. 메소드 내 매개변수 3. this 속성 4. 메소드 내 생성된 객체 메소드 명 메소드의 이름은 어떻게가 아닌 무엇을 하는지 드러내게 지어야한다. 무엇을 하는지는 내부 구현을 설명하는게 되어버린디. 원칙 무조건 원칙을 지키는것이 좋은건 아니다 설계는 트레이드 오프이다. 좋은 프로그래머는 적재적소에 원칙을 지킨다. 객체에게 묻지말고 시키라한다 (내부구조 캡..
-
[오브젝트 - 2 ] 캡슐화 응집도 결합도 데이터중심설계개발/프로그래밍 2022. 6. 1. 17:09
데이터 지향 설계와 객체 지향 설계의 차이를 비교하기 위해서 캡슐화 응집도 결합도를 기준삼을수 있다. 캡슐화 변경가능성이 높은 부분을 “구현” 상대적 안정적인 부분을 “인터페이스"라한다. 구현과 인터페이스를 구분하고 객체 외부에서는인터페이스에 의존하도록 관계를 조절해야한다. 정리하여 캡슐화란 변경 가능성이 높은 구현부분을 객체 내부로 숨기는 것이다. 응집도 모듈 내 요소들이 “하나"의 목적을 위해 협력한다면 그 모듈은 높은 응집도를 가진다. 따라서 한 객체가 가진 책임들이 서로 얼마나 관련이 높은지를 의미한다. 응집도가 높다면 변경이 발생할때 모듈 내부에서 많은 변경에 일어날것이고 외부에 영향을 주지 않느다. 결합도 한 모듈이 다른모듈에대해 얼마나 많은 지식을 가졌는지 척도이다. 다른모듈의 세세한 부분까..
-
[오브젝트 - 1 ] 객체 지향 프로그래밍개발/프로그래밍 2022. 5. 14. 16:42
제대로 실행 되어야하고 변경이 용이해야 하고 이해하기 쉬워야 한다. class Theather { private ticketSeller : TicketSeller init(ticketSeller : TicketSeller){ self.ticketSeller = ticketSeller } func enter(Audience audience){ if(audience.getBag().hasInvitation()){ let ticket = ticketSeller.getTicketOffice().getTicket() audience.getBag().setTicket(ticket) }else{ let ticket = ticketSeller.getTicketOffice().getTicket() audience.get..
-
클린 아키텍쳐 , 레이어드 아키텍쳐개발/프로그래밍 2022. 5. 5. 17:35
레이어드 아키텍처 각각 역할에 맞게 계층을 나눈것이다. UI(Presentation) → Application → Domain → Infra(Data) 위와같이 계층이 나누게되며 화살표 방향대로 의존성 방향이다. 간단히 각 계층은 이런 역할들을 담당한다. UI 웹통신 프레임워크, 인터페이스, 입출력 등 외부와의 통신 Application 앱의 주요기능(비즈니스 로직) ,트랜잭션의 시작과끝 Domain 도메인 문제를 담담 (모델) Infra DB와 연결 , 앱외적인 인프라와의 어댑터역할 레이어드 아키텍쳐의 단점은 DB가 설계의 중점이된다는것이다. 따라서 설계에서 DB 설계를 먼저 하게된다. DB설계를 먼저 하게되면 객체의 “액션"이 먼저가 아닌 “상태" 중심적인 설계를 하게된다. 이는 객체지향에 벗어나는 ..
-
Swift 코드로 SOLID 이해하기개발/프로그래밍 2022. 5. 1. 18:53
SRP (단일 책임 원칙) 객체는 하나의 책임을 가진다. 여러 책임을 가지면 안된다. 따라서 객체의 역할을 정의하고 책임 주도설계 해야한다. OCP (개발 폐쇄 원칙) 객체의 확장에는 열려있고 수정에는 닫혀있어야한다. 기존 코드를 변경하지 않고 기능확장 할수 있도록 하느것이 목적이다. class Developer : Employee{ func develop() } class Designer : Employee{ func design() } class Marketer : Employee{ func marketing() } class Company{ let workers : [Employee] func doWork(){ for worker in workers{ if(worker is Developer){ w..
-
HTTP 헤더 정보 , 캐시개발/프로그래밍 2022. 3. 21. 12:40
일반 헤더 HTTP 전송에 필요한 모든 부가정보가 헤더에 들어간다. 과거에는(RFC2616) 헤더에 이런 정보들이 포함되어 있었다. 1. 메시지 전체에 적용되는 정보, 2. 요청정보(브라우저정보), 3.응답정보, 4.바디(엔티티)정보(contentType,length) 2014년 이후 RFC7230이 등장했고 메시지에 들어가는 정보가 표현(Representation) 데이터 와 표현 헤더라 불리게 되었다. 표현이란 데이터를 “HTML이라는 표현으로 전달할지 json 표현으로 전달할지” 같은 표현을 말한다. 표현데이터는 요청 및 응답에서 전달할 실제 데이터 이며 표현 헤더는 이 표현 데이터를 해설 할수있는 정보를 제공 협상헤더 클라이언트가 원하는 표현을 요청하는것을 협상헤더라 한다. (미디어타입,문자,압충..