실제로 내가 코드의 일부분을 리팩터링합니다. 내가하고 싶은 일은 "TaskArgument"개체를 사용하여 "Task"개체를 초기화하는 것입니다. "TaskArgument"가 추상이고 "Task"가 "OnEnterTask (TaskArgument args)"메서드를 구현하고 (범위를 벗어난 기존 시스템의 일부 특수한 동작에 대해) 봉인되어 있다고 가정 해 보겠습니다.친절한 수업 #
이전 코드 :
public sealed class Task : SomeSystemBaseTask {
private int accessMe;
private int meToo;
public void OnEnterTask(TaskArgument args) {
if (args is SimpleTaskArgument) {
accessMe = ((SimpleTaskArgument)args).uGotIt;
meeToo = 0;
} else if (args is ComplexTaskArgument) {
accessMe = ((ComplexTaskArgument)args).uGotItValue * ((ComplexTaskArgument)args).multiplier;
meToo = ((ComplexTaskArgument)args).multiplier - 1;
}
}
}
은 무엇을 가장 좋은 방법은 유형 체킹을 피할 것입니까? 처음 stupud의 생각이었다 :
public abstract class TaskArgument {
internal public abstract Initialize(Task args);
}
public class SimpleTaskArgument : TaskArgument {
public int uGotIt = 10;
internal public Initialize(Task task){
task.accessMe = uGotIt;
}
}
public class ComplexTaskArgument : TaskArgument {
public int uGotItValue = 10;
public int multiplier = 10;
internal public Initialize(Task task){
task.accessMe = uGotItValue*multiplier;
task.meToo = multiplier - 1;
}
}
public sealed class Task : SomeSystemBaseTask {
public int accessMe;
public int meToo;
public void OnEnterTask(TaskArgument args){
args.Initialize(this);
}
}
하지만 내 "accessMe는"공개하고 "초기화"방법은 "작업"에서만 작동합니다. 그래서 나는 typechecking을 다른 장소로 옮겼습니다 (장래에). 은 모범 사례 또는 좋은 디자인 아이디어입니다.
... "내부 공개"... mmhhmm?
또 다른 미친 아이디어는 내부 클래스했지만, 나는 그처럼 해달라고과 같은 간단한 경우는 더 복잡하거나하지 않습니다 : 그것의 기반이되는 경우
public abstract class TaskArgument {
internal public abstract Initialize(ITaskWrapper wrapper);
}
public class SimpleTaskArgument : TaskArgument {
...
}
public class ComplexTaskArgument : TaskArgument {
...
}
public interface ITaskWrapper {
public int AccessIt { set; get; }
...
}
public sealed class Task : SomeSystemBaseTask {
private int accessMe;
...
class TaskWrapper : ITaskWrapper {
...
}
public void OnEnterTask(TaskArgument args){
args.Initialize(new TaskWrapper(this));
}
}
어디 초기화를위한 최고의 장소입니다 주어진 "TaskArgument"유형?
친절하게 내 나쁜 영어 지식
인사 당신이 그 클래스 위에 TaskArgument의 각 하위 클래스와 연관된 논리를 데려 가고 싶다는처럼
이 간단한 초기화에 적용됩니다. –
@mo, 예 간단한 초기화를 위해 작동합니다. 그러나 위의 의존성 웹을 만드는 것처럼 보입니다. Task 클래스에서 TaskArg 객체를 가져 와서 TaskArg가 자신을 전달하는 곳 (this)에서 initialize를 호출하면 냄새라고 생각합니다. 그것은 어색한 양방향 의존성입니다. 당신의 염려를 분리하십시오! Task 및 TaskArgs에서 state를 사용하는 계산을 수행해야하는 경우 Task 및 TaskArgs를 상태 비즈니스 클래스로만 유지합니다 (최소 비즈니스 로직 사용). 그런 다음 둘 모두에 대해 알고있는 다른 클래스를 만들고 (거기에 대해서는 알지 못함) 거기에서 계산을 수행하십시오. 내게는 – manu08
이 맞습니다 :) 가장 깨끗한 방법 일 수 있습니다. –