반응형

객체와 자료구조로 데이터 표현하기

 

목차

1. 자료구조 vs 객체

2. 객체 - 디미터 법칙

3. DTO

4. Active Record


1.  자료구조 vs 객체

자료구조(Data Structure) 객체(Object)
데이터 그 자체 비즈니스 로직과 관련
자료를 공개한다. 자료를 숨기고, 추상화한다.
자료를 다루는 함수만 공개한다.
변수 사이에 조회 함수와 설정 함수로 변수를 다룬다고 객체가 되지 않는다.(getter, setter) 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조잘할 수 있다.

절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 함수를 고쳐야 한다.

 

객체지향 코드는 새로운 클래스를 추가하기 쉽다. 하지만 함수를 추가해야 한다.

 

상황에 맞는 선택을 한다.

  - 자료구조를 사용하는 절차적인 코드는 기본 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다.

  - 절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다.

 

  - 객체지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.

  - 객체지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.  

 

2.  객체 - 디미터 법칙

내 친구만 호출하지 내 친구의 친구까지 호출하면 안된다. 연쇄작용이 이어지기 때문에

휴리스틱 : 경험에 기반하여 문제를 해결하기 위해 발견한 방법 의사결정을 단순화하기 위한 법칙들

    - 경험적으로 만들어낸 법칙 ex) Clean Code

기차 충돌 : 디미터의 법칙에 어긋나는 상황

 

3.  DTO(Data Transfer Object) 

 * 자료구조

다른 계층 간 데이터를 교환할 때 사용

 

4. Active Record

 * 자료구조

Database row를 객체에 맵핑하는 패턴

  - 비즈니스 로직 메서드를 추가해 객체로 취급하는 건 바람직하지않다.

  - 비즈니스 로직을 담으면서 내부 자료를 숨기는 객체는 따로 생성한다.

  - 객체가 많아지면 복잡하고, 가까운 곳에 관련 로직이 있는 것이 좋으므로 현업에서는 Entity에 간단한 메서드를 추가해서 사용한다.

 

 

 

728x90
반응형

'Book > Clean Code' 카테고리의 다른 글

[Clean Code] Chapter 08  (0) 2022.03.20
[Clean Code] Chapter 07  (0) 2022.03.17
[Clean Code] Chapter 05  (0) 2022.03.12
[Clean Code] Chapter 04  (0) 2022.03.12
[Clean Code] Chapter 03  (0) 2022.03.09
반응형

코드의 가독성에 필수적은 포맷팅

 

목차

1. 포맷팅이 중요한 이유

2. 크린코드 포맷팅

3. Java Class Declarations

4. Team Coding Covention


1. 포맷팅이 중요한 이유

  * 가독성이 필수적이다.

  - 코드를 수월하게 읽어나갈 수 있다.

  - 아마추어처럼 보이지 않는다.

  - 코드를 잘못 해석해서 버그를 발생하는 위험을 줄일 수 있다.

 

 

2. 클린코드 포맷팅

  - 적절한 길이 유지 :

        200라인 정도, 200라인 넘어간다면 클래스가 여러개의 일을 하고 있을 가능성이 높다.

  - 밀접한 개념은 서로 가까이에 둔다 :

        행 묶음은 완결된 생각 하나를 표현하기 때문에 개념은 빈 행으로 분리한다.

        변수는 사용되는 위치에서 최대한 가까이 선언한다.

 

 

3. Java Class Declarations

  Class 내부 코드 순서

   1. static 변수 :

       public -> protected -> package -> private 순서

   2. instance 변수 :

       public -> protected -> package -> private 순서

   3. 생성자

   4. 메서드 :

       public 메서드에서 호출되는 private 메서드는 그 아래에 둔다. 가독성 위주로 그룹핑

 

 

4. Team Coding Convention

  개발 언어의 컨벤션이 우선이지만, 애매한 부분은 팀 컨벤션을 따른다. 없다면 같이 만들어가자!

 

참고 컨벤션

  - https://naver.github.io/hackday-conventions-java/ 

 

캠퍼스 핵데이 Java 코딩 컨벤션

중괄호({,}) 는 클래스, 메서드, 제어문의 블럭을 구분한다. 5.1. K&R 스타일로 중괄호 선언 클래스 선언, 메서드 선언, 조건/반복문 등의 코드 블럭을 감싸는 중괄호에 적용되는 규칙이다. 중괄호

naver.github.io

  - https://google.github.io/styleguide/javaguide.html 

 

Google Java Style Guide

1 Introduction This document serves as the complete definition of Google's coding standards for source code in the Java™ Programming Language. A Java source file is described as being in Google Style if and only if it adheres to the rules herein. Like ot

google.github.io

 

728x90
반응형

'Book > Clean Code' 카테고리의 다른 글

[Clean Code] Chapter 07  (0) 2022.03.17
[Clean Code] Chapter 06  (0) 2022.03.13
[Clean Code] Chapter 04  (0) 2022.03.12
[Clean Code] Chapter 03  (0) 2022.03.09
[Clean Code] Chapter 01 ~ 02  (0) 2022.03.06
반응형

목차

1. 주석을 최대한 쓰지 말자

2. 좋은 주석

3. 주석보다 annotation

4. JavaDoc


1.  주석을 최대한 쓰지 말자

 * 주석은 나쁜 코드를 보완하지 못한다.

  - 코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문이다. 자신이 저지른 난장판을 주석으로 설명하지 말고 개선하는데 시간을 보내야 한다.

  - 코드로도 의도를 표현할 수 있다.

  - 주석은 방치되는 경우가 많다.(코드는 컴파일 되기때문에 계속적으로 관리되지만 주석은 텍스트 그자체이기 때문에 방치될 수 있다.)\

 

2.  좋은 주석

 - 구현에 대한 정보를 제공한다.

 - 의도와 중요성을 설명한다.

 - TODO : 앞으로 할 일, 지금은 해결하지 않지만 나중에 해야할 일을 미리 적어둘 때

 - FIXME : 문제가 있지만, 당장 수정할 필요는 없을 때, 가능하면 빨리 수정하는게 좋다

 

3.  주석보다 annotation

 - 코드에 대한 메타 데이터

 - @Deprecated : 컴파일러가 warning을 발생시킴, IDE에서 사용시 표시됨

 - @NotThreadSafe : Thread Safe하지 않음을 나타냄

 

4. JavaDoc

   /**

     *

     */    <- 이런식으로 사용

 - JavaDoc build 명령어로 JavaDoc이 만들어진다. 문서화된 내용을 따로 볼수가 있다.

728x90
반응형

'Book > Clean Code' 카테고리의 다른 글

[Clean Code] Chapter 07  (0) 2022.03.17
[Clean Code] Chapter 06  (0) 2022.03.13
[Clean Code] Chapter 05  (0) 2022.03.12
[Clean Code] Chapter 03  (0) 2022.03.09
[Clean Code] Chapter 01 ~ 02  (0) 2022.03.06
반응형

목차

1. SOLID

2. 간결한 함수 작성하기

3. 안전한 함수 작성하기

4. 함수 리펙터링

 


1. SOLID

SRP - 단일 책임 원칙 

OCP - 개방 폐쇄 원칙

LSP - 리스코프 치환 원칙

ISP - 인터페이스 분리 원칙

DIP - 의존성 역전 원칙

 

SRP (단일 책임 원칙)

 * 한 클래스는 하나의 책임만 가져야 한다.

 - 클래스는 하나의 기능만 가지며, 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.

 - SRP 책임이 분명해지기 때문에, 변경에 의한 연쇄작용에서 자유로워질 수 있다.

 - 가독성 향상과 유지보수가 용이해진다.

 - 실전에서는 쉽지 않지만 늘 상기해야 한다.

 

OCP (개방 폐쇄 원칙)

 * 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야한다.

 - 변경을 위한 비용은 가능한 줄이고, 확장을 위한 비용은 가능한 극대화 해야 한다.

 - 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소에는 수정이 일어나지 않고, 기존 구성 요소를 쉽게 확장해서 재사용한다.

 - 객체지향의 추상화와 다형성을 활용한다.

 

LSP(리스코프 치환 원칙)

 * 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.

 - 서브 타입은 기반 타입이 약속한 규약(접근제한자, 예외 포함)을 지켜야 한다.

 - 클래스 상속, 인터페이스 상속을 이용해 확장성을 획득한다.

 - 다형성과 확장성을 극대화하기 위해 인터페이스를 사용하는 것이 더 좋다.

 - 합성(composition)을 이용할 수도 있다.

 

ISP(인터페이스 분리 원칙)

 * 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.

 - 가능한 최소한의 인터페이스만 구현한다.

 - 만약 클래스를 이용하는 클라이언트가 여러 개고, 이들이 클래스의 특정 부분만 이용한다면, 여러 인터페이스로 분류하여 클라이언트가 필요한 기능만 전달한다.

 - SRP가 클래스의 단일 책임이라면, ISP는 인터페이스의 단일 책임

 

DIP(의존성 역전 원칙)

 * 상위 모델은 하위 모델에 의존하면 안된다. 둘 다 추상화에 의존해야 한다.

    추상화는 세부 사항에 의존해서는 안된다. 세부 사항은 추상화에 따라 달라진다.

 - 하위 모델의 변경이 상위 모듈의 변경을 요구하는 위계관계를 끊는다.

 - 실제 사용관계는 그대로이지만 추상화를 매개로 메시지를 주고 받으면서 관계를 느슨하게 만든다.

 

2. 간결한 함수 작성하기

 함수 인수 - 인수의 갯수는 0~2개가 적당하다.

                    3개 이상인 경우  1. 객체를 인자로 사용

                                              2. 가변 인자를 사용 ex) (Object... args) 잘 사용하지는 않는다.

 

3. 안전한 함수 사용하기

 부수 효과(Side Effect)없는 함수

 부수 효과? 값을 반환하는 함수가 외부 상태를 변경하는 경우

 

4. 함수 리펙터링

 1. 기능을 구현하는 서투른 함수를 작성한다. - 길고, 복잡하고, 중복도 있다.

 2. 테스트 코드를 작성한다. - 함수 내부의 분기와 엣지값마다 빠짐없이 테스트하는 코드를 짠다.

 3. 리팩터링 한다. - 코드를 다듬고, 함수를 쪼개고, 이름을 바꾸고, 중복을 제거한다.

 

728x90
반응형

'Book > Clean Code' 카테고리의 다른 글

[Clean Code] Chapter 07  (0) 2022.03.17
[Clean Code] Chapter 06  (0) 2022.03.13
[Clean Code] Chapter 05  (0) 2022.03.12
[Clean Code] Chapter 04  (0) 2022.03.12
[Clean Code] Chapter 01 ~ 02  (0) 2022.03.06
반응형

1장. 깨끗한 코드

나쁜 코드

 - 성능이 나쁜 코드

 - 의미가 모호한 코드

 - 중복된 코드

 

나쁜 코드가 나쁜 이유

  * 깨진 유리창 법칙(깨진 유리창을 방치해두면 그 중심으로 범죄가 확산된다.)

 - 생산성 저하

 - 새로운 시스템을 만들게 된다. (어느 한 부분만 수정할 수 없게됨, 현실적으로 매우 어려움)

 

나쁜 코드를 짜는 이유

 - 일정이 촉박해서 

 - 영향 범위가 넓어서(영향 범위 예측이 안되서 보수적으로 코드를 작성하게 된다.)

 

클린 코드

비아네 스트롭스트룹 

" 나는 우아하고 효율적인 코드를 좋아한다.

  논리가 간단해야 버그가 숨어들지 못한다.

  의존성을 최대한 줄여야 유지보수가 쉬워진다.

  오류는 명백한 전략에 의거해 철저히 처리한다.

  성능을 최적으로 유지해야 사람들이 원칙 없는 최적화로 코드를 망치려는 유혹에 빠지지 않는다.

  깨끗한 코드는 한 가지를 제대로 한다. "

 

클린 코드 조건

 - 성능이 좋은 코드

 - 의미가 명확한 코드 = 가독성이 좋은 코드

 - 중복이 제거된 코드

 

보이스카우트 룰

 - "캠프장을 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라" -> 전보다 더 깨끗하한 코드로 만들어라

 

2장. 의미있는 이름

 - 의미가 분명한 이름 짓기 - ex) int a, b 

 - 루프 속 ijk 사용하지 않기 - 굳이 index 값이 필요없다면.. 사용하게 된다면 최대한 의미를 부여해서 사용 ex) row, col, depth

 - 통일성 있는 단어 사용하기

 - 병수명에 타입 넣지 않기 - ex) String nameString => name, Account[] accountArray => accounts 

* 팀간의 충분한 의사소통을 통해서 맞추는게 중요

 

참고 가이드 - google java naming guide

- https://google.github.io/styleguide/javaguide.html#s3.2-package-statement

- google java naming guide 구글링하면 한국어로 번역된 블로그 많이 나온다.

728x90
반응형

'Book > Clean Code' 카테고리의 다른 글

[Clean Code] Chapter 07  (0) 2022.03.17
[Clean Code] Chapter 06  (0) 2022.03.13
[Clean Code] Chapter 05  (0) 2022.03.12
[Clean Code] Chapter 04  (0) 2022.03.12
[Clean Code] Chapter 03  (0) 2022.03.09

+ Recent posts