Antilog의 개발로 쓰다
반응형

한 메소드에 오직 한 단계의 들여쓰기만 한다.

else 키워드를 쓰지 않는다.

if(num < 0){
    println("negative number")
    return
}
println("positive number")

모든 원시값과 문자열을 포장(wrap)

java)

void sell(int price);
//아래와 같이 바꾼다.
void sell(Money price);

class Money{
    private int value;

    Money(int value){
        this.value = value;
    }
}

kotlin)

fun sell(price:Int)

fun sell(price:Money)

class Money(value:Int){

    private var value:Int = value

}

위와 같이 사용함으로 해당 객체에 의미를 부여할 수 있다.

그리고 아래와 같이 의미 부여된 객체에 제약 조건을 줄 수 있다.

java)

class PositiveNum{
    private int num;

    PositiveNum(int num){
        if(num < 0){
            throw new IllegalException();
        }
        this.num = num
    }
}

kotlin)

class PositiveNum(num:Int){

    var positiveNumber:Int = 0

    init{     
        if(num < 0){
            throw IllegalException("It`s not Positive Number")
        }
        this.positiveNumber = num
    }
}

 

이러한 방법을 통해 PositiveNumber 객체를 만들어 양수를 보장할 수 있어 추가적인 예외처리를 하지 않아도 된다.

코드 한 줄에는 점(.) 하나만 허용

Demeter의 법칙을 지키자.

2020/07/28 - [개발로 쓰는 공부] - 디미터 법칙:The Law of Demeter(Don't Talk to Strangers)

 

디미터 법칙:The Law of Demeter(Don't Talk to Strangers)

본 내용은 공부한 내용을 바탕으로 정리한 내용입니다. 잘못된 부분이 있다면 댓글로 남겨주세요~ The Law of Demeter 객체 지향 디자인 원칙중 하나로 "최소 지식 원칙"디미터 혹은 디메테르라 불리�

antilog.tistory.com

한 줄에는 점을 하나만 찍는다.

myService.getInstance()
    .requestToMyAPI()

줄여쓰지 않는다

축약어는 절대 사용하지 않는다. 모든 변수와 함수 명은 해당 역할을 명확하게

모든 엔티티를 작게 유지한다.

 

2개 이상의 인스턴스 변수를 가지는 클래스를 쓰지 않는다.

 

일급 컬렉션을 사용한다.(제일 클래스 콜렉션 사용)

간단하게 아래와 같이 사용하는 것을 의미한다.

다음과 같은 코드를

Map<String, String> tagList = new HashMap<>();

map.put("1","A tag");
map.put("2","B tag");

아래와 같이 감싸서 사용하는 것을 말한다.

public class TagList{
    private Map<String, String> tagList;

    public TagList(Map<String,String> tagList){
        this.tagList = tagList
    }
}

자세한 내용은 추후 공부를 통해 추가할 예정.

getter/setter/property를 쓰지 않는다.

해당 사항이 필요할 경우는 목적이 분명한 데이터 검증이 있을 경우 사용한다.

그외는 getter,setter,property 대신 객체에 일을 해달라는 메시지를 보낸다.

굳이 예를 들자면

"A+10을 실행해야해, A 값을 줘!"

위의 경우 보다는 아래와 같이

"A에 10을 더해줘"

A.getValue + 10 (X)

A.add(10)

이렇게 사용함으로 데이터를 은닉할 수 있다고 한다.

객체는 내부 데이터 구현을 노출하면 안된다. 접근 메소드와 수정 메소드는 내부 데이터와 구현을 노출시키므로 유지 보수에 악영향을 미치고, 가능한 사용하지 않는다.

필드를 private으로 하고 get/set 메소드의 추가는 코드를 복잡하게 하고 아무런 이득이 없다

객체들 간의 관계를 세심히 디자인하면 대부분 클래스의 get,set 메소드는 필요하지 않다.

구현 은닉이 제대로 되어 있는가? 즉, 클래스의 구현 방식을 마음대로 바꾸어도 외부에 영향을 미치지 않는가?

어떠한 작업을 수행하는데 필요한 정보를 요구하지 말라. 대신 정보를 가진 객체에 일을 해달라 부탁해라.

두 자동차의 연식을 비교하여 출력해야하는 예시가 있다고 하면 다음과 같은 느낌이다.

java)

class Car implements Comparable<Car> {

    private String modelName;

    private int modelYear;


    Car(String modelName, int modelYear, String color) {

        this.modelName = modelName;

        this.modelYear = modelYear;

    }



    public String getModel() {

        return this.modelYear + "식 " + this.modelName;

    }



    public int compareTo(Car otherCar) {

        if (this.modelYear == otherCar.modelYear) {

            return 0;

        } else if(this.modelYear < otherCar.modelYear) {

            return -1;

        } else {

            return 1;

        }

    }

}



public class Comparable01 {

    public static void main(String[] args) {

        Car car01 = new Car("아반떼", 2016, "노란색");

        Car car02 = new Car("소나타", 2010, "흰색");



        System.out.println(car01.compareTo(car02));

    }

}

kotlin)

class Car(
    val modelName:String,
    val modelYear:Int,
): Comparable<Car>{

    fun getModle():String{
        return "$modelYame 식 $modelName"
    }

    override fun comparTo(otherCar:Car):Int{
        return when{
            this.modelYear == otherCar.modelYear -> 0
            this.modelYear < otherCar.modelYear -> -1
            else -> 1
        }
    }
}

class Comparable01 {
    fun main(args: Array<String>) {
        val car1 = Car("아반떼", 2016)
        val car2 = Car("소나타", 2010)

        println(car1.comparTo(car2))
    }
}
반응형
profile

Antilog의 개발로 쓰다

@Parker_J_S

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...