제 경험 상, 모든 변수 이름을 RESTful 하게 지으면, 인텔리센스와 같은 코드 헬퍼가 문제를 일으킬 때 자괴감이 듭니다.
특히, 대부분의 IDE 는 일정 수준의 편집 히스토리가 넘어가면, 느려지거나 버벅이기 마련입니다. 이때 코드 헬퍼도 함께 느려지고, 그 느려짐은 내 손가락이 매워야 하죠. ^^
저는, 로컬 변수(혹은 식별자)와 그 외 변수(혹은 식별자)로 나눠서 생각합니다.
로컬 변수는 수명이 짧기 때문에, 변수의 이름이 코드의 가독성에 미치는 영향이 크지 않기에 짧고 간결하게 짓습니다.
로컬 변수의 의미가 중요할 정도로 메서드의 범위가 넓다면, 그것은 잘 못된 설계일 확률이 높았습니다.
로컬 변수들에 구분이 중요할 정도로 개수가 많은 것도 설계상의 오류인 경우가 많았습니다. 이 경우, 개수 만큼 할당도 많이 일어나기에, 보이지 않는 성능 구멍으로 작용했습니다.
로컬 변수 이외의 식별자들은 사용자 코드 입장에서 읽기 편하도록 만듭니다.
enum Drive { C, D, E, }
// enum LocalDrive { C, D, E , } => 약간 중복적. 역전앞 같은 느낌.
// 확장 메서드의 자기 변수는 사용자에게 공개되지 않습니다.
public static string ToPathHeader(this Drive d)
=> d.ToString() + @":\";
// 공개되는 매개변수는 메서드 이름과 호응되도록
public static string Lead(this Drive d, string directory)
=> d.ToPathHeader() + directory;
.
위의 코드에 나타난 식별자들은 나름 이유있는 이름을 가지고 있지만, 사용자 코드 입장에서는 뭔가 어색합니다.
var c = Drive.C;
var d = Drive.D;
var cph = c.ToPathHeader();
var dph = d.ToPathHeader();
var f1 = @"temp\temp1.txt";
var f2 = @"temp\temp2.txt"
var f1Path = c.Lead(f1);
var f2Path = c.Lead(f2);
사용자의 코드가 자연스럽게 읽히지도 않을 뿐더러, 모든 로컬 변수들은 모두 string 인데, 이를 말해주는 단서가 하나도 없습니다.
그래서, 사용자 코드를 읽기 쉽게 만들고, 형식에 대한 단서를 제공하기 위해 아래와 같이 변경합니다.
public static string ToPathString(this Drive d)
=> d.ToString() + @":\";
public static string ToPathString(this Drive d, string directory)
=> d.ToPathString() + directory;
//혹은
public static string ToPathString(this Drive d, string directory = string.Empty)
=> d.ToPathString() + directory;
사용자 코드
var c = Drive.C;
var d = Drive.D;
var cPath = c.ToPathString();
var dPath = d.ToPathString();
var f1 = @"temp\temp1.txt";
var f2 = @"temp\temp2.txt"
var f1Path = c.ToPathString(f1);
var f2Path = c.ToPathString(f2);
cPath 가 로컬 변수가 아닌 클래스의 멤버로 정의되는 경우라도, 비 공개 멤버라면 로컬변수처럼 지어도 무방하다고 생각합니다. 이 경우, 생성자가 아닌 선언초기화 문법으로 초기화 하는게 가독성 측면에서 더 좋더군요.
// 생성자 초기화
readonly string _cPath;
public MyType()
{
_cPath = Drive.C.ToPathString();
}
// 선언 초기화
readonly string _cPath = Drive.C.ToPathString();