-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
개요
1.1 코드를 배우는 이유
1.1.1 고품질의 코드 작성
- 속도와 확장성을 맹목적으로 추구하는 현재의 개발 환경
- 고품질 코드 작성할 시간이 많이 없다.
- 유지보수하는 것은 무척 힘들다.
- 높은 품질의 코드를 작성할려면? -> 코드 설계에 대한 이론적인 지식을 갖춰야 한다.
1.1.2 복잡한 코드 개발
- 어려움 2가지
- 매우 높은 수준의 기술이 필요한 경우
- 복잡한 비즈니스, 코드양이 매우 많은 시스템 즉,
소프트웨어 개발의 복잡성
- 코드 설계에 대한 지식이 있어야 한다.
- 보통은, 비즈니스의 요구 사항에 따라 코드를 채우는 것이 일반적인 업무
- 질문, 코드 설계를 의식하고 개발하자.
- 계층화와 하위 모듈화 방법
- 클래스 어떻게 나눌지
- 각 클래스에 어떤 속성과 메서드를?
- 클래스 간의 상호작용 설계 방법은?
- 상속이나 연관을 사용하는게 좋을까?
- 인터페이스나 추상 클래스 사용이 옳은가?
- 결합도가 높은 코드와 낮은 코드?
- 디커플링을 달성하는 방법은?
- 싱글턴 패턴이나 정적 메서드 사용하는 것이 옳은가?
- 객체를 생성할 때 팩토리 패턴을 사용하는 것이 옳은가?
- 가독성 유지 및 확장성 향상을 위한 디자인 패턴 도입 방법은?
1.1.3 프로그래머의 기본 능력
- 프로그래머는 기술의 넓이와 깊이 둘다 있어야 한다.
- 심층적인 이해가 필요.’
- 우수한 프로젝트는 코드와 클래스가 많으며, 클래스 구조와 클래스 간의 관계 호출 관계도 복잡하다..
- 고도의 본질을 이해하자.
1.1.4 경력 개발에 필요한 기술
- 기본적인 능력 향상 및 기본적인 지식 습득에 꾸준히 신경을 써야 한다.
- 신입과 주니어 엔제니어의 코드리뷰 및 양성, 이끄는 일도 해야 한다.
- 팀의 개발 효율성을 신경써야 한다.
- 잘 설계되고 유지보수가 쉬운 시스템이 되어 의미있는 일을 더 할 수 있도록 한다.
1.2 코드 품질 평가 방법
- 코드 품질 평가
- 어떤 코드가 높은 가독성을 가지는 코드인가?
- 어떤 종류의 코드가 확장과 유지 관리에 용이한가?
- 가독성, 확장성, 유지보수 사이의 관계는 무엇인가?
- 유지 보수는 정확히 어떤 것을 의미하는 것인가?
- 코드 품질 요소
- 유연성 (Flexibility)
- *확장성 (Extensibility)
- *유지 보수성(Maintainability)
- *가독성 (Readability)
- 이해 용이성 (Understandability)
- 가변성 (Changeability)
- *재사용성 (Reusability)
- *테스트 용이성 (Testability)
- 모듈성 (Moduarity)
- 높은 응집도와 낮은 결합도 (High cohesion loose coupling)
- 높은 효율성 (High efficiency)
- 고성능 (High performance)
- 보안성 (Security)
- 호환성 (Compatibility)
- 사용성 (Usability)
- 깨끗함 (Clean)
- 명확성 (Clarity)
- *간결성 (Simplicity)
- 직접성 (Straightforward)
- 더 작은 코드가 더 많은 것을 담는다 (less code is more)
- 문서화가 잘 된 (well-documented)
- 계층화가 잘 이루어진 (well-layered)
- 정확성 (Correctness, Bug free)
- 강건성 (Robustness)
- 신뢰성 (Reliability)
- 확장성 (Scalability)
- 안정성 (Stability)
- 우아함 (Elegant)
1.2.1 유지보수성
- 서비스 중인 프로젝트의 경우, 새로운 코드보다는 유지관리하는데 시간이 훨씬 오래 걸릴 수 있다.
- 따라서 코드의 유지보수성이 특히 중요하다.
- 코드가 간결하고 가독성이 좋으며 확장성이 높고 명확하게 계층화되어 있으며 높은 모듈성 높은 응집도 낮은 결합도를 가지고, 구현보다는 인터페이스 기반의 설계원칙을 고수하면 코드의 유지보수가 쉽다는 의미일 수 있다.
1.2.2 가독성
- SW 설계 전문가 마틴 파울러(Matin Fowler) : ”컴퓨터가 이해할 수 있는 코드는 바보라도 작성할 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 작성한다.“
- 코드의 명명이 의미가 있는지, 주석이 자세히 기술되어 있는지, 함수길이 적절한지, 모듈 구분이 명확한지, 높은 응집도와 낮은 결합도를 가지는지 확인
1.2.3 확장성
- 기존 코드를 약간 수정 아니면 전혀 수정하지 않는 것 만으로 새로운 기능을 추가하는 것
1.2.4 유연성
- 유연성은 추장적인 표현이다.
- 코드가 확장 및 재사용에 용이하고 사용성이 높은 경우 일반적으로 코드가 유연하다고 할 수 있다.
1.2.5 간결성
- KISS (Keep It Simple, Stupid) 원칙
- 코드를 가능한 한 단순하게 유지한다. 즉, 단순하고 면확한 코드
1.2.6 재사용성
- 코드 작성을 최소화하고 기존 코드를 재사용 하는 것
- 다양한 설계 원칙, 설계 사상, 디자인 패턴에 의해 달성되는 최종 효과
- DRY(Don’t repeat yourself)원칙
1.2.7 테스트 용이성
- 테스트 용이성 수준이 코드 품질 수준 측면을 정확하게 반영
1.3 고품질 코드를 작성하는 방법
- 고품질 코드는 1.2에서 언급한 것과 같이, 유지하기 쉽고, 읽기 쉽고, 확장하기 쉽고, 유연하고, 간결하고, 재사용이 가능하고, 테스트가 가능한 코드를 의미한다.
- 객체지향 설계 패러다임, 설계 원칙, 코딩 규칙, 리팩터링 기술, 디자인 패턴 및 일부 세련되고 구현 가능한 프로그래밍 방법론을 마스터 해야 한다.
- 이러한 궁극적인 목표는 고품질 코드를 작성하는 것이다.
1.3.1 객체지향
- 프로그래밍 패러다임 주도하는 세 가지 스타일
- 절차지향 프로그래밍
- 함수형 프로그래밍
- 객체지향 프로그래밍
- 객체지향 프로그래밍은 캡슐화, 추상화, 상속, 다형성의 풍부한 특성으로 인해 복잡한 설계 사상을 실현할 수 있다.
- 때문에 다양한 설계 원칙과 디자인 패턴 코딩 구현의 기초가 된다.
- 2장 예고
- 객체지향의 네 가지 주요 특성
- 캡슐화, 추상화, 상속, 다형성
- 객체지향 프로그래밍과 절차저 프로그래밍의 차이점과 연계
- 객체지향 분석, 설계, 프로그래밍
- 인터페이스와 추상 클래스의 차이점과 각각 응용 시나리오
- 구현이 아닌 인터페이스를 기반으로 한 설계 사상
- 더 많은 합성, 더 적은 상속의 설계 상사
- 절차적인 빈약한 도메인 모델과 객체지향의 풍성한 도메인 모델
- 객체지향의 네 가지 주요 특성
1.3.2 설계 원칙
- 설계 원칙이 어떤 문제와 응용 시나리오를 해결하는데 사용되는 것인지 파악해야 한다.
- 설계원칙인 정신적인 방법, 디자인 패턴은 움직임
- 설계 원칙들
- 단일 책임 원칙
- 개방 폐쇄 원칙
- 리스코프 치완 원칙
- 인터페이스 분리 원칙
- 의존 역전 원칙
- KISS 원칙 (keep it simple stupid)
- YAGNI 원칙 (you aren’t gonna need it)
- DRY원칙 (don’t repeat yourself)
- LoD원칙 (law of demeter)
1.3.3 디자인 패턴
- 개발에서 자주 접하게 되는 일부 설계 문제에 대해 요약된 솔루션 또는 설계 사상을 모아둔 것.
- 디자인 패턴의 대부분은 디커플링과 확장성 문제를 해결한다.
- 디자인 패턴의 연구는 어떤 문제와 일반적인 애플리케이션 시나리오를 과용하지 않고 해결할 수 있는지 숙달하는데 집중해야 한다.
- 프로그래밍 언어가 발전하면서, 싱글턴 패턴과 같은 일부 디자인 패턴은 더 이상 사용되지 않고 안티패턴으로 간주한다.
- 반면에 반복자 패턴같은 일부 새로운 디자인 패턴이 등장하고 있다.
- 22개의 고차원적인 디자인 패턴을 다룰 예정.
- 패턴은 범주인 생성, 구조, 행동 패턴으로 구분할 수 있다.
1.3.4 코딩 규칙
- 주로 코드의 가독성 문제를 해결한다. 더 기본적이고 중요하다.
- 코딩규칙은 설계원칙과 디자인 패턴에 비해 구체적이며, 코드 세부 사항에 중점을 두기 마련이다.
- 최소한 변수, 클래스, 함수 명명규칙, 코드 주석 다는 범위와 같은 코드 규칙에 능숙해야 한다.
- 코드 품질을 향상시키는 17가지 규칙을 요약해줄 예정.
1.3.5 리팩터링 기법
- 지속적인 리팩터링은 코드 품질 저하를 방지하는 효과
- 코드의 희망이 없는 수준의 손상을 효과적으로 방지한다.
- 리팩터링을 위한 도구
- 객체지향 프로그래밍 패러다임, 설계 원칙, 디자인 패턴, 코딩 규칙
- 설계 원칙과 디자인 패턴의 중요한 응용 시나리오는 리팩터링
- 디자인 패턴을 과도하게 사용하면 코드의 복잡성이 증가.
- 초기 단계의 과도한 설계와 개발 문제를 효과적으로 방지할 수 있다.
- 리팩터링의 3가지 측면
- 리팩터링 목적, 대상, 시기, 방법
- 오류가 없는지 확인하기 위한 기술적 수단
- 두 가지 다른 규모의 리팩터링 (대규모 고수준, 소규모 저수준 리팩터링)
요약
- 객체지향 프로그래밍 페러다임
- 캡슐화, 추상화, 상속, 다형성등 풍부한 기능으로 복작한 설계 사상을 구현할수 있다.
- 디자인 패턴 구현의 기초
- 설계 원칙
- 코드 설계를 이끌어 내는 몇 가지 경험의 요약
- 일반적인 방향을 나타내는 정신
- 디자인 패턴보다 더 일반적이다.
- 디자인 패턴
- 개발에서 자주 접하는 문제에 대한 해결방법 및 사상을 모아둔 것.
- 디커플링을 통해 코드 확장이 주 목적.
- 디자인 패턴은 더 구체적이고 구현하기 쉽다.
- 코딩 규칙
- 가독성 문제를 해결
- 리팩터링
- 코드 품질 저하를 방지
- 객체지향 프로그래밍 패러다임, 설계원칙, 디자인 패턴, 코딩 규칙에 의존
- 최종 목적은 고품질 코드 작성
1.4 과도한 설계를 피하는 방법
- 과도한 설계는 나중에 요구사항이 변하지 않을 수도 있기 때문에 코드의 복잡성만 높일 뿐이다.
1.4.1 코드 설계 원리 의도는 코드 품질을 향상 시키는 것이다.
- 이를 적용 하는 궁극적인 목적, 원래 위도는 코드의 품질을 향상시키는 것이다.
- 왜 이런 방식으로 살게 하는지, 왜 이 디자인 부터을 제공 하는지, 실제로 코드 품질을 향상 시킬 수 있는지, 코드 품질을 어떤 측면을 계산할 수 있는지를 생각해야 한다.
- 과도한 설계는 설계를 위한 설계
1.4.2 코드의 설계 원칙은 앞에 문제가 있고, 뒤에 방안이 있다.
- 제품의 포인트(불편함을 느끼는 지점)가 어디인지, 사용자의 니즈가 무엇인지 생각하고 요구사항에 맞는 기능을 개발해야지, 화려한 기능을 먼저 개발한 후 요구사항을 끼워 맞추는 방식은 좋지 않다.
1.4.3 코드 설계의 응용 시나리오는 복잡한 코드에 적용되어야 한다.
- 간단한 문제 -> 복잡한 디자인 패턴을 사용할 필요가 없다.
- 디커플링의 주요 목적은 코드의 복잡성 처리.
- 복잡한 코드 문제를 해결하기 위해 디자인 패턴이 만들어졌다.
- 코드가 복잡할 수 록 설계에 더 많은 시간을 할애해야 한다.
1.4.4 지속적인 리팩토링은 과도한 설계를 효과적으로 방지할 수 있다.
1.4.5 특정 시나리오 외의 코드 설계에 대해 이야기 하지 않는다.
- 특정 시나리오 없이 코드 설계가 합리적인지 이야기 하는 것은 무의미.
- 비즈니스에서 아키택쳐에 대해 이야기하는 것은 비현실적이다.
Metadata
Metadata
Assignees
Labels
No labels