반응형

좋은 코드는 언어나 기술에 종속되지 않는다.

 

그렇지만 코딩을 하면서 매일 드는 생각은 '그래서 이게 잘 짠 코드인가?' 이다.

 

결론부터 말하자면, 내가 생각하는 잘 짠코드의 정의는 단 두가지로 함축될 것 같다.

1. 남들이 읽기 쉬운가? a.k.a 가독성
    이 '남'의 정의를 코드를 짠 이후의 미래의 '나'도 '남'에 포함해야한다고 본다.
    시간이 지나고 다시 들여다 보면 내가 쓴 게 아닌 것 같다...
    ...그래서 보통 주석을 달곤하지만, 과연 그 주석도 잘 읽히던가?


2. 재사용이 가능한가 +모듈화
    내가 짠 코드를 다른 프로젝트에서도 그대로 가져와 쓸 수 있는지,
    그리고 타인이 사용했을 때도 간단하게 사용할 수 있는지

    간단한 것 조차도 항상 확장성을 고려해서 짜야한다

 

위의 내용만 잘 지켜도 유지 보수가 쉽고 확장 가능한 프로그래밍이라 할 수 있을듯하다.
하지만, 그 디테일 함은 여전히 누구나 어려워한다. 그래서 나도 몇가지 규칙을 두고 코딩을 하려고 노력한다.

오늘은 그 규칙들 중 4가지 정도만 설명해보고자 한다.

 

 

 

1) 주석보다 코드내용에 집중하자

주석이 달린 코드는 이후 수정이 필요할때 수정하고 난 후 주석도 같이 수정해야하지만 생각보다 번거롭다.

특히나 협업의 경우 다른 팀원이 내 코드내용을 수정한 이후 주석도 같이 수정해주는 팀원은 희귀했다.

이런문제들로 쌓인 '잘못된 주석' 때문에 리딩을 다시 해야하는 경우도 종종 생긴다

 

2) 이름은 항상 중요

아래 3)항과 같은 내용이라고도 볼수 있을지 모르겠지만

변수명이 무엇을 담고있는 변수인지 구체적으로 명시하자.

string name; //(X)
string user_name; //(O)

 

마찬가지로 함수명도 어떠한 기능을 하는지에 대해 구체적이고 명확한게 좋다.

 

하지만, 이름을 짓는게 가장 고통스럽다

프로그래머가 가장 힘들어하는 일은? = 이름 짓기...공감... 출처:나무위키

 

3) 조건은 항상 짧게

예시를 들어보면 바로 알 수 있다.

if(level > 1 && job == EJob.Designer && isWhiteUser)
{
	//내용
}

조건을 변수로 빼주고나면, 해당 조건문이 무엇을 뜻하는지 명확하게 알 수 있다.

bool isManager = level > 1 && job == EJob.Designer && isWhiteUser;
if(isManager)
{
	//내용
}

 

4) 리턴의 활용

코드를 보면 무슨 얘기를 할지 바로 이해할듯하다.

1.

public int GetUserPermission()
{
    int permission;
    if (IsWhiteUser()) //화이트유저인지체크
    {
        if (job == EJob.none) //Job이 공란일 경우
        {
            permission = 0;
        }
        else //Job이 공란이 아닐때
        {
            permission = level; 
        }
    }
    else
    {
        permission = 0;
    }
    return permission; //권한값을 리턴
}

2.

public int GetUserPermission()
{
    if (IsWhiteUser() && job != EJob.none) return level;
    return 0;
}

위 2개의 함수는 같은 기능을 한다.

그러나 1번 함수는 쓸데없이 이중 조건을 걸고 있다. (읽는데 거부감이 있다)

그리고 return에 대한 의미를 정확히 이해를 하지 못해 사족이 많이 길다.

당연하겠지만 if문에 들어가서 return이 되면 그 함수는 종료가 된다.

그럼 else는 필요가 없다.

 

//더 줄이자면 이렇게 변태같이 줄일 수도 있겠지만 좋은 예시는 아니라고 생각이 든다
public int GetUserPermission()=> (IsWhiteUser() && job != EJob.none) ? level : 0;

 

본인은 병적으로 코드최적화에 집착한다.

줄 수를 줄이면 최적화가 된다고 생각하는 사람이 많은 것 같은데, 맞는 말 같기도 틀린말 같기도 하다.

줄 수에 집착하기 보다는 정확한 플로우를 이해하는게 중요한 것같다.

즉, '실행 시점'과 '조건'을 잘 생각한다면 많은 것이 해결되더라.

 

더불어 enum의 활용과 코딩컨벤션, 상수활용 등 많은 방법이 있지만 커먼한 방법들이라 판단이되어 따로 게제하지는 않았다.

추후에 시간이 된다면 해볼지도..

반응형
반응형

 

안녕하세요~ 알기쉽게 설명하는 초보자를 위한 무꼬입니다.

오늘은 Visual Basic으로 암호화 및 복호화 코딩에 대해 강좌를 하도록 하겠습니다 ㅎㅎ


우선 암호화복호화에 대해 알아보죠~!


[암호화]

데이터 전송 시 타인의 불법적인 방법에 의해 데이터가 손실되거나 변경되는 것을 방지하기 위해 데이터를 변환하여 전송하는 방법.

의미를 알 수 없는 형식(암호문)으로 정보를 변환하는 것.


[복호화]

암호화의 반대 과정.



우선 암호화에는 대칭형(DES)과 비대칭형(RSA)이 있어요.

설명하기가 어려운 부분이 있어서 네이버 지식백과를 참고해서 설명해드릴게요~


대칭형 암호화 방식의 비밀키 암호화기법(DES)비대칭형 암호화 방식의 공개키 암호화 기법(RSA)이 있다. 비밀키 암호화 기법은 동일한 키로 암호화와 복호화를 수행하는 방법으로 보안 유지와 키 관리에 어려움이 있으나 알고리즘이 간단해 암호화 속도가 빠르고 용량이 작아 경제적이다. 공개키 암호화 기법은 공개되는 공개키(public key)와 본인만 사용하는 비밀키(private key)로 구성되는 것으로 공개키와 비밀키를 별도로 관리하기 때문에 키 관리가 용이하며 암호화와 사용자 인증이 동시에 이뤄진다는 특징이 있다. 이는 전자 문서의 디지털서명, 부인봉쇄에 사용된다. 그러나 알고리즘이 복잡해 속도가 느리다는 단점을 가지고 있다.

[네이버 지식백과] 암호화 [暗號化, encryption] (시사상식사전, 박문각)



DES기법 기초 및 중급 암호화 강좌에서 아주 적절한 예라고 생각해서ASCII 코드를 이용한 대칭기법 암호화를 강좌 하겠습니다 ㅎㅎㅎ


혹시라도 아스키코드(ASCIIcode)에 대해서도 모르시는 분들을 위해 조그만 설명을 드리자면,
 American Standard Code for Information Interchange 의 약자로서정보 교환용으로 미국에서 만든 표준 코드입니다.ASCII 코드 표

대문자, 소문자, 숫자, 특수기호, 제어정보등을 포함하는 8개의 비트 코드로 구성이 되며그 중 일곱개의 비트는 코드화되어 있는 문자세트,한 개는 패리티비트(에러 검사용)로 사용 됩니다~ 
뭔소린지 모르겠고, 그냥 암호화 하는 방법이나 가르쳐 달라구요? 그럼 본론으로 들어가볼까요?

[원리 알고리즘]

"Hello~? 무꼬의 블로그입니다!!!" 라는 문자열을 암호화 할 때.
1. 우선 해당 문자열의 길이를 구합니다.(Hello~? 무꼬의 블로그입니다!!! 는 길이가 20)
2. 문자열에서 n번째 글자를 따옴(첫번째부터 문자열길이 까지.)(첫번째 글자인 'H'를 따옴)
3. n번째 글자를 ASCII코드화(숫자화) 시킵니다.('H'를 ASCII코드화 시키면 '72'가 됨.)
4. 암호화 할 대칭 키(Key)만큼 해당숫자에서 뺌.(무꼬는 1을 뺄것임! 72 - 1   1의 데미지를 입었다!!!  71이 됨.더해도 상관은 없음 하지만 복호화 할때는 반대 작업이 필요하니 복호화 할땐거꾸로 빼줘야 겠죠?)
5.이제 이 숫자를 다시 문자화 시켜줌.('H'는 'G'라는 숫자가 되었다!!)
6. 이제 다시 2번으로 돌아가서 두번째, 세번째 문자를 차례로 위의 방법대로 진행합니다.그럼 해보진 않았지만 앞의 'Hello~?'만 보면 'Gdkkp}>' 라는 알수 없는 문자열로 변형 되어 있겠죠?(※한글은 더 복잡하게 알수없게 바뀝니다.)



이제 코딩을 보시죠.


[VB 코딩] 

 EnCoding(문자열)

'출처를 밝히지 않고 퍼갈수 없습니다. 출처를 밝히세요.'출처 무꼬's Art-Life  http://art-life.tistory.comFunction EnCoding(ByVal Input_Str AString'Input_Str:문자열을 받을 변수 Dim Len_Str As Double '문자열의 길이값을 저장할 변수Dim Result As String '결과값을 받을 변수
Dim
Temp_Str As String '임시로 문자를 받을 변수Len_Str = Len(Input_Str) '1. 해당문자열의 길이를 구합니다.
for As Double = 0 to Len_Str - 1 Temp_Str =  Mid(Input_Str,n,1)   '2. 문자열에서 n번째 글자를 따옵니다.'3. n번째 글자를 ASCII코드화(숫자화) 시키고(Asc) 4. 대칭 키 만큼 뺌!(-1) 5. 그리고 다시 문자화 시켜줌 (Chr) Temp_Str = Chr(Asc(Temp_Str) - 1Result &= Temp_Str '5.Next nMsgBox Result '메세지창으로 띄워줌. 혹은 EnCoding = Result 를 써저 재귀함수로 만들어주어도! ㅎㅎ



처음 하시더라도 위에 원리를 보시고 코딩을 분석하시면 되게 쉬울거에요.


자 그럼 복호화는 어떻게 하냐구요?

똑같아요.

다만 아까 대칭 키를 입력할때 빼거나, 더했을 텐데 (저는 -1 을 했죠 ㅎㅎ)

그 반대로 해주는 거죠.

암호화할 때 - 1 을 했다면 복호화 때는 + 1

- 2 를 했다면 복호화 할때는 + 2 를 해주면 된다는 거죠.


그럼 뭐 볼것도 없지만 복호화 코딩도 한번 보실까요?

 DeCoding(문자열)

'출처를 밝히지 않고 퍼갈수 없습니다. 출처를 밝히세요.'출처 무꼬's Art-Life  http://art-life.tistory.comFunction DeCoding(ByVal Input_Str AString'Input_Str:문자열을 받을 변수Dim Len_Str As Double '문자열의 길이값을 저장할 변수Dim Result As String '결과값을 받을 변수 
Dim 
Temp_Str As String '임시로 문자를 받을 변수Len_Str = Len(Input_Str) '1. 해당문자열의 길이를 구합니다.
for As Double = 0 to Len_Str - 1 Temp_Str =  Mid(Input_Str,n,1)   '2. 문자열에서 n번째 글자를 따옵니다.Temp_Str = Chr(Asc(Temp_Str) + 1)  '이 부분만 다르죠 ㅎㅎResult &= Temp_Str '5.Next nMsgBox Result '메세지창으로 띄워줌. 혹은 DeCoding = Result



이해 하셨으리라 믿겠습니다 ㅎㅎ
아 혹시나 궁금한점이 있으시거나,모르겠다 하시면 댓글을 달아주시면 최대한 빠른 시일 내에 답해드리도록 하겠습니다 ㅎㅎ



그럼 즐프로그래밍 하세요~ 이상 무꼬였습니다. ( p.s - 하트 한번 눌러주세요 ㅎㅎ)

반응형

+ Recent posts