일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 믹스인
- 상속
- 설계 재사용
- OCP
- 서브 타이핑
- 하향식 접근
- 유연한 설계
- 의존성
- 행동 호환성
- 알고리즘
- dip
- 추상화
- 합성
- '기존 설계 재사용
- 오브젝트
- 다형성
- 객체 생성 사용 분리
- 메서드를 통한 해결
- iSP
- 일관성 있는 협력
- OOP
- 명령-쿼리 분리
- 객체지향
- 책임주도설계
- Swift#flatMap#map#Monad#함수형 프로그래밍#Optional
- 컴파일 타임 의존성
- 유여난 설계
- 런타임 의존성
- Apple # HIG #iOS15 #iOS14 #Human #Interface #Guidelines #Apple developer # Apple human interface guidelines
- 상속 조합 폭발적 증가
- Today
- Total
목록전체 글 (62)
도니의 iOS 프로그래밍 세상
객체 협력 구조가 기존과 다를 때, 코드의 이해도가 낮아지고 코드 수정시 더 많은 버그를 유발하게 된다.따라서 객체간 일관성 있는 협력 방식을 사용하여, 유사 기능엔 유사한 협력 패턴을 사용해야 한다.설계 일관성변하는 개념, 변하지 않는 개념을 분리변하는 개념을 캡슐화 하는 게 중요캡슐화는 변화는 어떤것을 감추는 것(데이터 은닉만을 포함하지 않음)결론일관성 있는 협력을 통해, 다른 사람들과 협업시 코드 이해도를 높이고 버그 가능성을 줄일 수 있음캡슐화약간의 부조화를 수용하더라도, 서비스 내에 일관성 있는 패턴을 지키는게 더 중요하다ex. 인터페이스에 객체중 한곳에서 특정 로직을 수행해야 함해당 객체의 역할상 특정 로직을 수행한다는게 초기 의도와 다름하지만 그렇더라도, 각 서비스들의 책임이 올바르게 동작한..
LSP서브 타입과 서브 클래스가 부모 클래스, 상위 타입 대체가 가능 해야함불가능한 예시직사각형, 정사각형현실에서는 정사각형은 직사각형의 한 종류 지만, 동작이 달라 상속이 불가능 함why? 정사각형은 높이를 변경하면, 너비도 함께 바뀜(따라서, 두 사각형의 높이를 변경했을 때 넓이의 변화가 다름(직사각형은 높이만큼, 정사각형은 변경된 높이의 제곱만큼 영향을 받음)따라서 클라이언트의 가정에 따라 부모 클래스 가정을 세우고 맞게 처리해야 함is-a 관계는 클라의 입장에서 고려, 자식 객체가 부모 객체의 행동을 대체할 수 있어야 함(속성은 필요X)LSP의 효과유연한 설계(어떤 자식 클래스과도 안정적으로 협력이 가능)OCP를 위한 전제 조건why? 위반시엔 자식 클래스를 추가할 때마다 문제가 발생하기 때문계약..
밑의 내용은 “오브젝트” 도서를 읽고 본인이 이해한 내용을 정리한 글입니다. 실제 내용과 다를 수 있습니다.목차상속의 두 가지 목적타입서브 클래싱과 서브 타이핑결론1. 상속의 두가지 목적메인 목적은 타입 계층 구현, 이는 객체들간에 관계에 기반하여 확장에 유연한 설계를 가능하게 함동일한 메세지를 다르게 동작 하는 것이 다형적 계층에 기반타입 계층 구현부모는 일반화, 자식은 특수화코드 재사용코드 재사용은, 부모와 자식간의 강한 Coupling을 만들기 때문에 주의부수적인 효과로 생각하는게 더 유익2. 타입1. 프로그래밍적 관점타입에 수행되는 유효한 오퍼레이션 집합Int에선 + 가 덧셈, String에서는 문자열 연결오퍼레이션에 대한 유효한 문맥 제공(약속된 문맥 제공이 원문)Integer 값 덧셈을 위해선..
밑의 내용은 “오브젝트” 도서를 읽고 본인이 이해한 내용을 정리한 글입니다. 실제 내용과 다를 수 있습니다. 의존성객체 지향 설계에서, 객체간 협력은 필수적이나 과도하게 많은 협력은 추후 변경을 어렵게 한다.객체간의 협력은 객체간 정보를 가지고 있어야 하며, 이는 의존성이라고 부른다.잘못된 의존성은 유연한 설계를 방해하는 요소이다.1. 의존성의 이해의존성 전이캡슐화 여부에 따라 의존성이 전이된다.ex. PeriodCondition → Screening → Movie으로 의존성 구조이때, Screening이 캡슐화를 올바르게 처리하지 않으면 PeriodCondition은 Move에 의존하는 구조를 가질 가능성이 매우 높음의존성 해결 방법객체 생성 시점에 생성자에 의존성 주입객체 생성후 의존성 주입→ 생성 ..
밑의 내용은 “오브젝트” 도서를 읽고 본인이 이해한 내용을 정리한 글입니다. 실제 내용과 다를 수 있습니다. 추상화 문제 해결의 핵심만 남기는 작업 핵심을 남기기 어렵다면, 문제의 크기를 더욱 작은 문제의 단위로 나누는 작업인 분해를 실행 목차 Procedure 추상화, Data 추상화 Procedure 추상화의 문제점 ADT(Abstract Data Type) 결론 1. Procedure 추상화, Data 추상화 추상화의 두가지 종류 프로시저 추상화는 무엇을 해야 하는지에 대한 추상화 이전에 배웠던 대로 메서드를 통해서 추상화 하는 방식(ex. 가격을 계산하라) 데이터 추상화는 무엇을 알아야 하는지에 대한 추상화 이전과 달리, 메서드가 아닌 struct등이 추상화 됨 이전 추상화는 대부분 메서드의 추상..

함수형 프로그래밍에서 사용되는 말인 Monad에 대해서 설명하기 전, map 과 flatMap 의 차이점에 대해서 공부해보자 map과 flatMap은 차이점은 무엇일까? 가장 기본적인 차이점 map의 경우 데이터를 변환하는데 사용된다 let cast = ["Vivien", "Marlon", "Kim", "Karl"] let lowercaseNames = cast.map { $0.lowercased() } // 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"] flatMap은 2차원 이상의 배열들을 1차원 배열로 변환한다 let numbers = [1, 2, 3, 4] let mapped = numbers.map { Array(repeatin..

지난 시간에는 async let을 사용하여, concurrent하게 이미지를 다운로드 받는 방법에 대해 알아보았습니다. 이번시간에는 전부 async let을 처리하는것이 아닌, group Task라는 기능을 이용하여 작업을 병렬적으로 실행하는 방법에 대해서 이야기하겠습니다. 지난 포스팅을 보지 않으셨다면, async let(3)를 보고 오시면 이해가 더욱 쉽습니다. Group Task가 필요한 이유 async let은 비교적 간단하게 병렬적으로 이미지를 다운받을 수 있는 기능입니다. 하지만, async let의 한계는 static하게 결정된 task에서만 사용이 가능하다는 것입니다. 위 코드에서 보듯, 분명하게 두개의 child task가 생성될 거라는 점이 컴파일 시점에서도 이를 명확하게 알 수 있습니..

이번 시간에는 swift concurrency에서 Parallel 실행을 지원해주는 기능인 async let에 대해서 배워보도록 하겠습니다. 결론적으로 말하자면, 해당 기능을 사용함으로써 Serial하게 동작되었던 async 함수들이 Concurrent하게 실행 되도록 합니다. 기존 Async함수 호출시 문제점 우리는 async await 기술을 사용하여, 중첩된 클로저를 사용한 위의 코드를 밑의 코드와 같이 더욱 간결하게 바꿀수 있게 되었습니다. 하지만, 여기서 한가지 문제점이 떠오릅니다. 만약 수백개의 사진을 다운받는 코드라고 가정한다면 위의 코드는 어떻게 작동할까요? 위의 예제와 같이 순서대로 사진을 다운로드 받습니다. 좀더 간단한 용어로 표현하자면 “Serial(동기)”하게 작동되는 형태입니다. ..

이번시간에는 Autolayout간의 충돌을 해결할 수 있는 hugging priority, compression resistance에대해 알아보겠습니다. 두가지 키워드의 정의 및 사용법을 익히기 전 왜 필요한지에 대해 배우겠습니다. 필요한 이유 TextField와 Button이 동일선상에 위치합니다. TextField와 Button는 밑의 그림과 같이 서로 붙어있습니다. Autolayout은 에러없이 정상적으로 동작합니다. 하지만, 이때 TextField가 글자가 많아진다면 어떻게 될까요? 서로 고유크기를 지키면서 Autolayout까지 지키려고 했기 때문에 에러가 발생했습니다. 만약 본인이 컴퓨터라면 둘중 어떤 크기를 줄이고, 어떤 크기를 그대로 둘것인가요? “제일 첫번째 그림과 같이 TextField..

Try - Catch 공부배경 Swift Concurrency에서 가장 큰 장점중 하나는 에러처리입니다. 기존에 Result Type을 사용하거나, nil을 completion handler를 통해서 전달할 필요가 없어졌기 때문입니다. 단순히 async함수에 throws라는 키워드만 붙임으로써 보다 간단하고 실수없는 에러처리를 할 수 있습니다. async 함수를 잘 적용하기 위해서 try catch가 언제 작동하며, 이들이 언제 에러를 전달하고 시스템 종료를 유발시킬수 있는지 알아야 합니다. Swift Error Handling 에러 던지기(Throwing Errors) Swift에서 Error는 Error Protocol을 준수하는 타입의 값으로 나타납니다. 해당 프로토콜을 채택하는 어떤 타입이든지간에..