깨끗한 C# 코드를 작성하는 방법? 프로그래밍 시간을 절약할 수 있는 5가지 팁

프로그래밍이 보이는 것처럼 항상 단순하지는 않습니다. 때로는 원하는 만큼 간단하지 않거나 사용하기 쉽지 않은 코드를 작성해야 합니다. 또한 개발자가 주변에서 가장 깨끗한 코더가 아닌 회사에서 일하는 경우 때때로 다른 사람의 지저분한 코드를 편집해야 할 수도 있습니다. 스스로 제대로 하세요.

이미 알고 있듯이 - 모르는 사람들을 위해 - 저는 Writing Clean C# Code 전용 기사 시리즈를 만들고 있습니다. 이제 두통을 완화하는 새로운 방법을 살펴보겠습니다.


함수 인수 제한



함수가 가지는 매개변수의 수를 제한하는 것은 매우 중요합니다. 기억하세요: 간단할수록 좋습니다. 함수가 3개 이상의 인수를 가질 때 문제가 발생합니다. 함수가 수행하는 작업을 이해하는 데 많은 문제가 발생할 수 있기 때문입니다.

나쁜 방법:

public void ProtectApplication(string path, string configurationPath, string outPutPath, CancellationToken cancellationToken)
{
    // ...
}


좋은 방법:

public class ProtectionConfig
{
    public string Path { get; set; }
    public string ConfigurationPath { get; set; }
    public string OutPutPath { get; set; }
    public CancellationToken cancellationToken { get; set; }
}

var config = new ProtectionConfig
{
    Path = "./app.exe",
    ConfigurationPath = "./shield.config.json",
    OutPutPath = "./app_protected.exe",
    CancellationToken = source.Token;
};

public void ProtectApplication(ProtectionConfig config)
{
    // ...
}


가장 좋은 옵션은 1개 또는 2개의 인수를 사용하는 것입니다. 더 사용할 수 있습니까? 물론 할 수 있지만 몇 달 안에 무엇을 해야 하는지 파악해야 한다는 것을 알고 있는 경우에만 가능합니다. 이상은 3명 이상이 있을 때 그룹화하는 것입니다.

함수에 2개 이상의 인수가 있으면 함수가 너무 많은 작업을 수행하고 있음을 의미합니다.


기능에 기능 이름 지정



또 다른 나쁜 습관은 부정확하거나 불완전한 이름으로 함수 이름을 지정하는 것입니다. 함수의 이름만 읽어도 함수가 정확히 무엇을 하는지 거의 100% 알 수 있습니다. 그렇지 않으면 혼란만 야기할 뿐입니다.

나쁜 방법:




public class SlackNotification
{
    //...

    public void Handle()
    {
        SendMessage(this._to, this._files, this._body);
    }
}

var message = new SlackNotification(...);
// What is this? A handle for the message? Are we writing to a file now?
message.Handle();


좋은 방법:

public class SlackNotification
{
    //...

    public void Send()
    {
        SendMessage(this._to, this._files, this._body);
    }
}

var message = new SlackNotification(...);
// Clear and obvious
message.Send();


가장 좋은 권장 사항은 기능을 매우 잘 설명하는 이름을 생각하는 데 시간을 조금 더 보내는 것입니다. 좋은 이름을 정의하는 데 몇 초를 절약하기 위해 이 모범 사례를 수행하지 않으면 앞으로 해당 코드 줄을 읽고 그 내용을 이해하려고 노력하는 데 훨씬 더 많은 시간을 낭비하게 될 것입니다.


사용하지 않는 코드를 저장하지 마세요.



이 나쁜 습관은 우리가 집에 "물건"을 보관하거나 수집하지만 결코 사용하지 않는 경우를 생각나게 합니다. 이것은 동일하며 사용하지 않는 코드가 있으면 삭제하십시오. 공간을 차지하고 귀찮게 하는 것은 의미가 없습니다.

나쁜 방법:

public void OldRequestMethod(string url)
{
    // ...
}

public void NewRequestMethod(string url)
{
    // ...
}

var request = NewRequestMethod(requestUrl);
SlackChannel("bytehide", request, "get users");


좋은 방법:

public void RequestMethod(string url)
{
    // ...
}

var request = RequestMethod(requestUrl);
SlackChannel("bytehide", request, "get users");


기억하세요: 씹을 수 있는 것보다 더 많이 물지 마세요. 해당 코드를 사용하지 않았다면 거기에 보관할 필요가 없습니다. 필요할 경우를 대비하여 버전 기록에서 다시 확인할 수 있습니다.


기능당 하나의 추상화 수준



개발 중이고 함수에 하나의 추상화 수준만 있는 것이 아니라 여러 수준이 있는 경우 이는 함수가 자체적으로 너무 많은 작업을 수행하고 있음을 의미합니다.

이 나쁜 습관은 미래에 다음과 같은 질문을 생성하는 것 외에는 다음과 같습니다. 이것은 무엇입니까? 정확히 무엇을합니까? 동시에 많은 작업을 수행하기 때문에 코드를 재사용하기 어렵습니다.

나쁜 방법:

public string ParseBetterJSAlternative(string code)
{
    var regexes = [
        // ...
    ];

    var statements = explode(" ", code);
    var tokens = new string[] {};
    foreach (var regex in regexes)
    {
        foreach (var statement in statements)
        {
            // ...
        }
    }

    var ast = new string[] {};
    foreach (var token in tokens)
    {
        // lex...
    }

    foreach (var node in ast)
    {
        // parse...
    }
}


좋은 방법:

class Tokenizer
{
    public string Tokenize(string code)
    {
        var regexes = new string[] {
            // ...
        };

        var statements = explode(" ", code);
        var tokens = new string[] {};
        foreach (var regex in regexes)
        {
            foreach (var statement in statements)
            {
                tokens[] = /* ... */;
            }
        }

        return tokens;
    }
}

class Lexer
{
    public string Lexify(string[] tokens)
    {
        var ast = new[] {};
        foreach (var token in tokens)
        {
            ast[] = /* ... */;
        }

        return ast;
    }
}

class BetterJSAlternative
{
    private string _tokenizer;
    private string _lexer;

    public BetterJSAlternative(Tokenizer tokenizer, Lexer lexer)
    {
        _tokenizer = tokenizer;
        _lexer = lexer;
    }

    public string Parse(string code)
    {
        var tokens = _tokenizer.Tokenize(code);
        var ast = _lexer.Lexify(tokens);
        foreach (var node in ast)
        {
            // parse...
        }
    }
}


이렇게 하면 코드가 더 깨끗해지는 것 외에도 코드를 재사용하고 테스트할 수 있습니다(함수가 수행하는 많은 작업으로 인해 이전에는 제대로 수행할 수 없었음).


전역 함수에 작성하지 마십시오.



이 나쁜 습관은 전역을 "오염"시키는 것으로 구성됩니다. 문제가 있을 수 있고 다른 라이브러리와 충돌할 수도 있기 때문에 이것은 좋은 일이 아닙니다. 모든 사용자가 이 문제에 부딪힐 수 있으며 예외가 발생할 때까지 이를 인식하지 못합니다.

나쁜 방법:

public Dictionary<string, string> Config()
{
    return new Dictionary<string,string>(){
        ["product"] = "shield"
    };
}


좋은 방법:

class Configuration
{
    private Dictionary<string, string> _configuration;

    public Configuration(Dictionary<string, string> configuration)
    {
        _configuration = configuration;
    }

    public string[] Get(string key)
    {
        return _configuration.ContainsKey(key) ? _configuration[key] : null;
    }
}


그런 다음 구성을 로드하고 준비가 되면 Configuration 클래스의 인스턴스를 만듭니다.

var configuration = new Configuration(new Dictionary<string, string>() {
    ["product"] = "shield"
});


이제 예, 응용 프로그램에서 Configuration의 한 인스턴스를 사용해야 합니다.


이러한 방법은 이전 기사의 방법보다 약간 더 발전된 방법이지만 여전히 간단하지만 매우 유용합니다. 내가 말했듯이 C#에서 더 깔끔한 코드를 작성하는 방법의 수는 우주보다 더 무한합니다. 이것이 제가 Cleaner C# 코드 목록을 만드는 이유입니다. 예, 확인하는 것이 좋습니다.

관심이 있으신 분들은 팔로우를 잊지 마시고 소식을 놓치지 마세요!

좋은 웹페이지 즐겨찾기