분류 전체보기에 해당하는 글 16

클린 코드

Common/Books|2019. 9. 17. 10:04

이 책은 제목처럼 깨끗한 코드를 작성하는 것에 중요성과 그 방법에 대해 기술한 책이다.

여기서 깨끗한 코드는 읽기 쉬운 코드를 뜻한다.

읽기 쉬운 코드란 변수나 함수를 봤을 때 그 의도가 명확하고 예상하는대로 행동하며

하나의 클래스를 수정하려고 할 때 모든 코드를 확인해야 하는 불상사가 없어야한다.

책의 언어 자체는 Java로 작성되어있으나 대부분의 언어에서 포괄적으로 적용할 수 있는

기법들이 작성되어 있기 때문에 타 언어 사용자도 충분히 볼 만한 가치가 있다.

 

-인상 깊은 구절

한마디로 중복을 피하라. 한 기능만 수행하라. 제대로 표현하라. 작게 추상화하라.

'Common > Books' 카테고리의 다른 글

Effective C#  (0) 2019.09.14
객체지향의 사실과 오해  (0) 2019.09.13
실용주의 프로그래머  (0) 2019.09.13

댓글()

yield 문과 Iterator에 대해서

C#/Story|2019. 9. 16. 17:29
IEnumrable<int> Range(int start,int end) {
    for (int i=start;i<end;i++) {
    	yield return i;
    }
}

이런식으로 yield return 같은 방법으로 값을 반환하는데 쓴다.

yield 키워드가 없었다면 이 함수는 항상 start(int)값을 반환하는 함수가 되었겠지만

yield 문은 함수가 어디까지 실행되었는지를 기억해서 그 이후부터 실행하기 때문에

이 함수는 start부터 end-1값까지의 이터레이터를 반환하는 함수가 된다.

그럼 이터레이터를 반환하지않고 그냥 리스트를 반환하면 되지라고 생각할 수도 있으나 

그 차이를 알아보기 위해 위 함수와 같은 행동을 하는 RangeInList 작성해보았다. 

IEnumrable<int> RangeInEnumerable(int start,int end) {
    for (int i=start;i<end;i++) {
    	Console.Write(i);
    	yield return i;
    }
}

List<int> RangeInList(int start,int end) {
    var list=new List<int>();
    for (int i=start;i<end;i++) {
    	Console.Write(i);
    	list.Add(i);
    }
    return list;
}

static void Main() {
    RangeInEnumerable(0,10000).Take(5).Foreach(x=>{
    	//Action
    });//Console Result: 01234
    
    RangeInList(0,10000).Take(5).Foreach(x=>{
    	//Action
    });//Console Result: 012345....9999 
}

이터레이터를 반환하는 함수는 해당 Element가 필요할 때 까지 지연했다가 쿼리가 끝날때 한번만 순회한다.

그러므로 Linq와 같은 쿼리구문과 궁합이 매우 좋고 시퀀스를 처리하는데 매우 적합하다.

'C# > Story' 카테고리의 다른 글

ObservableCollection에 대해서  (0) 2019.11.02
2차원 배열과 Matrix Class 제작  (0) 2019.09.23

댓글()

[프로그래머스][C++]추석 트래픽

C++/알고리즘 문제|2019. 9. 14. 18:55

문제:https://programmers.co.kr/learn/courses/30/lessons/17676

#include <string>
#include <vector>
#include <iostream>
using namespace std;

struct mytime {
    int hour;
    int minute;
    double sec;
};

double convertDouble(const mytime& t) {
    double dt=t.sec;
    dt+=t.minute*60;
    dt+=t.hour*60*60;
    return dt;
}
mytime convertTime(const double& d) {
    mytime t{};
    t.sec=d;
    while (t.sec>=60) {
        t.sec-=60;
        t.minute++;
        if (t.minute>=60) {
            t.hour++;
            t.minute-=60;
        }
    }
    return t;
}

mytime getTime(const string& origin) {
    mytime t{};
    string text="";
    for (int i=0;i<origin.size();i++) {
        char c=origin[i];
        if (c==' ') break;
        if (('0'<=c && c<='9') || c=='.') {
            text+=c;
        }
    }
    t.hour=stoi(text.substr(0,2));
    t.minute=stoi(text.substr(2,2));
    t.sec=stod(text.substr(4));
    return t;
}


double getRes(const string& origin) {
    string t="";
    for (auto it=origin.begin()+13; it!=origin.end();it++) {
        char c=*it;
        if (c=='s') continue;
        t+=c;
    }
    return stod(t);
}


int solution(vector<string> lines) {
    //times 세팅완료
    vector<vector<double>> times;
    for (int i=0;i<lines.size();i++) {
        lines[i].erase(lines[i].begin(),lines[i].begin()+11);//2016-09-15 제거
        double endTime=convertDouble(getTime(lines[i]));
        double startTime=endTime-getRes(lines[i])+0.001f;
        vector<double> v(2);
        v[0]=startTime;
        v[1]=endTime;
        times.push_back(v);
    }
    
    
    
    int max=1;
    for (int i=0;i<times.size();i++) {
        int sum = 1;
        double backTime=times[i][1]+1;
        for (int j=i+1;j<times.size();j++) {
            double frontTime=times[j][0];
            if (frontTime<backTime) {
                sum++;
            }
        }
        if (sum>max) {
            max=sum;
        }
    }

    return max;
}

'C++ > 알고리즘 문제' 카테고리의 다른 글

[프로그래머스][C++]스킬트리  (0) 2019.09.14
[프로그래머스][C++] 기능개발  (0) 2019.09.14

댓글()