패턴 및 애플리케이션 아키텍처에 대해 많은 연습을하지 못했습니다. 간단히 말해, 필자는 어떤 피처를 대상으로하는 특정 속성을 찾아야합니다. 일부 코드는 작업을 더 잘 설명합니다.패턴을 사용한 리팩터링
IAttribute {
IAttribute analyze(IFunction func);
}
//up to 10 different attributes
ArgumentsAttribute implements Attribute {
Map<String, ArgType> args = new HashMap<>();
IAttribute analyze(IFunction func) {
for (Argument arg : func.getArgs()) {
args.put(arg.getName(), arg.getType());
}
if (!args.isEmpty()) return this;
return null;
}
}
ReturnAttribute implements Attribute {
IAttribute analyze(IFunction func) {
if (func.hasReturn) return this;
return null;
}
}
AttributeAnalyzer {
List<Attributes> analyzeAttributes(IFunction func) {
List<IAttribute> attributes = new ArrayList<IAttribute>();
attributes.add(new ArgumentAttribute());
attributes.add(new ReturnAttribute());
...
for (IAttribute attr : attributes) {
attr = attr.analyze(func);
if (null == attr) attributes.remove(attr);
}
return attributes;
}
}
그러나이 구현은 약간 이상하게 보입니다. 나는 Attribute가 홀더의 일종이라는 사실을 싫어하지만 그 자체를 찾기 위해 메소드를 구현해야한다. 필자의 의견으로는 정적 방법에 과부하를주는 것이 가장 좋지만 분명히 불가능합니다. 이런 식으로, 우리는 새로운 추상화를 추가하지 않고 (아마도 내가 옳지 않은) 홀더를 논리를 분석하는 것과 분리 할 것입니다.
IAttribute {
static IAttribute analyze();
}
ConcreteAttribute1 {
int x = 0;
static IAttribute analyze() {
...
if (x != 0) return new ConcreteAttribute1();
return null;
}
}
ConcreteAttribute2 {
String s = "";
static IAttribute analyze() {
...
if (!s.equals("")) return new ConcreteAttribute2();
return null;
}
}
AttributeAnalyzer {
List<Attributes> analyzeAttributes() {
List<IAttribute> attributes = new ArrayList<IAttribute>();
attributes.add(ConcreteAttribute1.analyze());
attributes.add(ConcreteAttribute2.analyze());
...
for (IAttribute attr : attributes) {
if (null == attr) attributes.remove(attr);
}
return attributes;
}
}
또한, I 버릇 특성을 필터링한다. 그렇다면이 코드를 더보기 좋게 만들기위한 리팩터링 방법이 있습니까?
코드에 따라 'ConcreteAttribute1' 및'ConcreteAttribute2' 클래스도 중복됩니다. 객체에 속성이 어떻게 적용되는지 언급해야합니다. 또한'AttributeAnalyzer'는 실제 속성을 수행하거나 주어진 속성에 대한 객체를 평가하는 것처럼 보이지 않습니다. – niksofteng
@ NikhilVartak 글쎄, 일부 속성은 지표 (예 : 속성 또는 속성과 같은 객체 기능)로만 제공되며 다른 속성에는 여러 개의지도 또는 목록이 포함될 수 있습니다. 그것보다, 객체와 그 속성의 목록은지도에 배치되고 데이터베이스에 저장됩니다. 마지막으로 다른 분석기는 속성을 사용하여 객체를 취하고 각 속성에 대해 객체의 변환을 수행합니다 (속성을 변경하지 않고). 필자의 특별한 경우 object는 함수이고 속성은 일부 속성 (예 : args 수 또는 반환 값 유형)이므로 'AttributeAnalyzer'는 인수 (함수)를 사용하여 처리합니다. – NikitaRock
예제 입력 및 예상 출력을 추가하십시오. 위에서 관련없는 코드를 제거 할 수 있습니다. – niksofteng