본문 바로가기

프로그래밍 놀이터/디자인 패턴, 리펙토링117

[책 정리] 6장. 함수형 프로그래밍 - Clean Architecture 정수를 제곱하기 -함수형 언어에서 변수는 변경되지 않는다. 불변성과 아키텍처 -경합 조건(race condition), 교착 상태(dealock) 조건, 동시 업데이트(concurrent update) 문제가 모두 가변 변수로 인해 발생한다.우리가 동시성 앱에서 마주치는 모든 문제, 즉 다수의 스레드와 프로세스를 사용하는 앱에서 마주치는 모든 문제는 가변 변수가 없다면 절대로 생기지 않는다. -아키텍트라면 동시성(concurrency)문제에 지대한 관심을 가져야만 한다.우리는 스레드와 프로세스가 여러 개인 상황에서도 설계한 시스템이 여전히 강건하기를 바란다. 가변성의 분리 -불변성과 관련하여 가장 주요한 타협 중 하나는 앱 또는 앱 내부의 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 일이다.상태 변.. 2020. 4. 10.
[책 정리] 5장. 객체 지향 프로그래밍 - Clean Architecture -좋은 아키텍처를 만드는 일은 객체 지향(Object-oriented) 설계 원칙을 이해하고 응용하는 데서 출발한다. 캡슐화? -OO 프로그래밍은 프로그래머가 충분히 올바르게 행동함으로써 캡슐화된 데이터를 우회해서 사용하지 않을 거라는 믿음을 기반으로 한다.OO 를 제공한다고 주장한 언어들이 실제로는 C언어에서 누렸던 완벽한 캡슐화를 약화시켜 온 것은 틀림없다. 상속? -OO 언어가 더 나은 캡슐화를 제공하지는 못했지만, 상속만큼은 OO 언어가 확실히 제공했다.하지만 상속이란 단순히 어떤 변수와 함수를 하나의 유효 범위로 묶어서 재정의하는 일에 불과하다.OO 언어가 완전히 새로운 개념을 만들지는 못했지만, 데이터 구조에 가면을 씌우는 일을 상당히 편리한 방식으로 제공했다고 볼 수는 있다. 다형성? -함수.. 2020. 4. 9.
[책 정리] 4장. 구조적 프로그래밍 - Clean Architecture 증명 -goto 문장이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방해가 되는 경우가 있다는 사실을 발견했다.만약 모듈을 분해할 수 없다면, 합리적으로 증명할 때 필수적인 기법인 분할 정복 접근법을 사용할 수 없게 된다. -모든 프로그램을 순차(sequence), 분기(selection), 반복(iteration)이라는 세 가지 구조만으로 표현할 수 있다. 해로운 성명서 기능적 분해 -구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있게 되었고, 이는 결국 모듈을 기능적으로 분해할 수 있음을 뜻했다.프로그래머는 대규모 시스템을 모듈과 컴포넌트로 나눌 수 있고, 더 나아가 모듈과 컴포넌트는 입증할 수 있는 아주 작은 기능들로 세분화될 수 있다. 엄밀한 증명은 없었다.. 2020. 4. 8.
[책 정리] 3장. 패러다임 개요 - Clean Architecture 구조적 프로그래밍 -구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해 규칙을 부과한다. 객체 지향 프로그래밍 -객체 지향 프로그래밍은 제어흐름의 간접적인 전환에 대해 규칙을 부과한다. 함수형 프로그래밍 -함수형 프로그래밍은 할당문에 대해 규칙을 부과한다. 생각할 거리 -각 패러다임은 프로그래머에게서 권한을 박탈한다.어느 패러다임도 새로운 권한을 부여하지 않는다.각 패러다임은 부정적인 의도를 가지는 일종의 추가적인 규칙을 부과한다.즉, 패러다임은 무엇을 해야 할지를 말하기보다는 무엇을 해서는 안 되는지를 말해준다. -프로그래밍 패러다임은 앞으로도 딱 세 가지밖에 없을 것이다.최소한 부정적인 의도를 가진 패러다임으로는 이 세 가지가 전부일 것이다. 결론 -세 가지 페러다임과 아키텍처의 세 가지 큰 관심사(.. 2020. 4. 7.
[책 정리] 2장. 두 가지 가치에 대한 이야기 - Clean Architecture -모든 소프트웨어 시스템은 이해관계자에게 서로 다른 두 가지 가치를 제공한다.행위(behavior)와 구조(structure)가 바로 그것이다.소프트웨어 개발자는 두 가치를 모두 반드시 높게 유지해야 하는 책임을 진다. 행위 아키텍처 -소프트웨어는 '부드러움을 지니도록' 만들어졌다.소프트웨어는 기계의 행위를 쉽게 변경할 수 있어야 한다.만약 기계의 행위를 바꾸는 일을 어렵게 만들고자 했다면, 우리는 소프트웨어가 아니라 하드웨어라 불렀을 것이다. -소프트웨어가 가진 본연의 목적을 추구하려면 소프트웨어는 반드시 '부드러워'야 한다.다시 말해 변경하기 쉬워야 한다.이해관계자가 기능에 대한 생각을 바꾸면, 이러한 변경사항을 간단하고 쉽게 적용할 수 있어야 한다.이러한 변경사항을 적용하는 데 드는 어려움은 변경되.. 2020. 4. 6.
[책 정리] 1장. 설계와 아키텍처란? - Clean Architecture -프로그램을 동작하게 만들기는 그리 어려운 일이 아니다.하지만 프로그램을 제대로 만드는 일은 전혀 다르다. 올바르게 만드는 일은 어렵다. -설계와 아키텍처의 차이는 무엇인가? 둘 사이에는 아무런 차이가 없다.아키텍처는 저수준의 세부사항과는 분리된 고수준의 무언가를 가리킬 때 흔히 사용되는 반면, (비유 : 집의 형태, 외관, 입면도, 공간, 방의 배치)설계는 저수준의 구조 또는 결정사항 등을 의미할 때가 많다. (비유 : 콘센트, 전등 스위치, 전등, 보일러, 온수기와 배출 펌프의 크기와 위치 등)하지만 결국은 무의미하다. 둘은 같다. 목표는? -소프트웨어 아키텍처의 목표는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소화하는 데 있다.설계 품질을 재는 척도는 고객의 요구를 만족시키는 데 드.. 2020. 4. 5.
Composite Pattern ( 콤포지션 패턴 ) Composite Pattern ( 콤포지션 패턴 ) https://en.wikipedia.org/?title=Composite_pattern -객체들의 관계를 트리 구조로 구성하여사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 하는 것이 포인트이다. -Composite pattern 에는 3가지 구성요소가 필요하다.1. 공통적으로 사용하고자 하는 function 을 담은 interface "Component".2. 단일 객체들을 담을 수 있는 복합 객체이며, interface 를 구현한 "Composite". 이 녀석들은 add, remove 함수와 내부적으로 list 를 갖는다.3. 단일 객체에 해당하는 interface 를 구현한 "Leaf". - ADD, Composite, Composit.. 2017. 6. 30.
Visitor Pattern ( 방문자 패턴, visitor 패턴 ) Visitor Pattern ( 방문자 패턴, visitor 패턴 ) https://en.wikipedia.org/?title=Visitor_pattern -객체의 구조와 기능을 분리시키는 패턴.구조는 변하지 않으면서 기능만을 따로 추가하거나 확장되어야 할 경우에 사용하는 패턴이다. -visitor pattern 은 2개의 interface 가 필요하다. 하나는 element 로 visitor 를 맞이하는 accept 라는 함수를 제공한다.다른 하나는 visitor 로 concrete 한 element 를 받아들이는 visit 함수를 제공한다. interface IElement{ void accept(IElementVisitor visitor);} inteface IElementVisitor{ void .. 2017. 6. 29.
[도서 목차 정리] Effective Java [Effective Java] 목차와 정리 링크 Chapter 1. 개요 개요 Chapter 2. 객체의 생성과 소멸 항목 1. 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자.항목 2. 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자.항목 3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자.항목 4. private 생성자를 사용해서 인스턴스 생성을 못하게 하자.항목 5. 불필요한 객체의 생성을 피하자.항목 6. 쓸모 없는 객체 참조를 제거하자.항목 7. 파이널라이저(finalizer)의 사용을 피하자 Chapter 3. 모든 객체에 공통적인 메소드 항목 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자.항목 9. equa.. 2017. 3. 30.