내 의견은 논란의 여지가 있지만, 나는 이런 종류의 스타일을 사용해야 할 상황이 있다고 생각합니다. 그러나 "변수의 범위를 줄이는 것"은 유효한 인수가 아닙니다. 이것이 이미 수행중인 작업이기 때문입니다. 그리고 그것을하기 위해 무언가를하는 것은 정당한 이유가 아닙니다. 또한 이러한 설명이 일반적인 구문인지 아닌지 팀이 이미 해결 한 경우이 설명은 의미가 없습니다.
나는 주로 C # 프로그래머이지만 Java에서 암호를 char[]
메모리에 유지하는 시간을 줄일 수 있도록 암호를 반환한다고 들었습니다 . 이 예제에서는 가비지 수집기가 사용하지 않는 순간부터 배열을 수집 할 수 있으므로 암호가 범위를 벗어나더라도 중요하지 않기 때문에 도움이되지 않습니다. 배열을 사용한 후에 배열을 지울 수 있는지 여부는 논쟁의 여지가 없지만이 경우 변수를 범위 지정하는 것이 합리적입니다.
{
char[] password = getPassword();
try{
keyStore.load(new FileInputStream(keyStoreLocation), password);
keyManager.init(keyStore, password);
}finally{
Arrays.fill(password, '\0');
}
}
이것은 리소스에 대한 범위를 지정하고 완료 한 후에 마무리를 수행하기 때문에 try-with-resources 문과 실제로 유사합니다 . 이 방법으로 암호를 처리한다고 주장하는 것이 아니라, 그렇게 결정하면이 스타일이 합리적이라는 점에 다시 한 번 유의하십시오.
변수가 더 이상 유효하지 않기 때문입니다. 의미있는 정보를 포함하지 않도록 작성하여 사용했으며 상태를 무효화했습니다. 이 블록 뒤에 변수를 사용하는 것은 의미가 없으므로 범위를 지정하는 것이 합리적입니다.
내가 생각할 수있는 또 다른 예는 이름과 의미가 비슷한 두 개의 변수가 있지만 하나를 사용하고 다른 것을 사용하고 별도로 유지하려는 경우입니다. 이 코드를 C #으로 작성했습니다.
{
MethodBuilder m_ToString = tb.DefineMethod("ToString", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, typeofString, Type.EmptyTypes);
var il = m_ToString.GetILGenerator();
il.Emit(OpCodes.Ldstr, templateType.ToString()+":"+staticType.ToString());
il.Emit(OpCodes.Ret);
tb.DefineMethodOverride(m_ToString, m_Object_ToString);
}
{
PropertyBuilder p_Class = tb.DefineProperty("Class", PropertyAttributes.None, typeofType, Type.EmptyTypes);
MethodBuilder m_get_Class = tb.DefineMethod("get_Class", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, typeofType, Type.EmptyTypes);
var il = m_get_Class.GetILGenerator();
il.Emit(OpCodes.Ldtoken, staticType);
il.Emit(OpCodes.Call, m_Type_GetTypeFromHandle);
il.Emit(OpCodes.Ret);
p_Class.SetGetMethod(m_get_Class);
tb.DefineMethodOverride(m_get_Class, m_IPattern_get_Class);
}
ILGenerator il;
메소드 상단에 단순히 선언 할 수 있다고 주장 할 수는 있지만 변수를 다른 객체 (kinda 기능적 접근법)에 재사용하고 싶지 않습니다. 이 경우 블록을 사용하면 구문 및 시각적으로 수행되는 작업을보다 쉽게 분리 할 수 있습니다. 또한 블록 후, 나는 끝났 il
으며 아무것도 접근해서는 안된다고 말합니다.
이 예제에 대한 논쟁은 메소드를 사용하는 것입니다. 아마도 그렇습니다.하지만이 경우 코드는 그렇게 길지 않으며 코드를 다른 메소드로 분리하면 코드에 사용 된 모든 변수를 전달해야합니다.