【发布时间】:2013-06-03 14:07:45
【问题描述】:
我最近遇到了一个问题,让我一直在思考。假设我有一个具有 O.A 和 O.B 属性的 O 类型对象。还假设我有一组 O 类型的实例,其中为每个实例定义了 O.A 和 O.B。
现在假设我需要使用 O.A 或 O.B 对 O 实例的集合执行一些操作(如排序),但不能在任何给定时间同时使用。我原来的解决方案如下。
示例——仅用于演示,而非生产代码:
public class O {
int A;
int B;
}
public static class Utils {
public static void SortByA (O[] collection) {
// Sort the objects in the collection using O.A as the key. Note: this is custom sorting logic, so it is not simply a one-line call to a built-in sort method.
}
public static void SortByB (O[] collection) {
// Sort the objects in the collection using O.B as the key. Same logic as above.
}
}
我最想做的是……
public static void SortAgnostic (O[] collection, FieldRepresentation x /* some non-bool, non-int variable representing whether to chose O.A or O.B as the sorting key */) {
// Sort by whatever "x" represents...
}
...但是创建一个新的、高度特定的类型,我必须维护它以避免重复几行代码似乎对我来说是不必要的。也许我在这方面是不正确的(如果该陈述是错误的,我相信有人会纠正我:D),但这仍然是我目前的想法。
问题:实现此方法的最佳方法是什么?我必须实现的逻辑很难分解成更小的方法,因为它已经相当优化了。问题的根源在于我需要使用对象的不同属性执行相同的操作。我想远离使用代码/标志/等。在方法签名中如果可能,以便解决方案尽可能稳健。
注意:在回答这个问题时,请从算法的角度出发。我知道某些特定于语言的功能可能是合适的替代方案,但我之前遇到过这个问题,并想从相对与语言无关的角度来理解它。另外,请不要仅将响应限制为排序解决方案,因为我仅选择它作为示例。真正的问题是在对对象的两个不同属性执行相同操作时如何避免代码重复。
【问题讨论】:
-
我觉得您的问题更多地与特定于语言的功能有关。我不明白“算法的观点”。唯一的逻辑发生在您的排序方法中。如果您不想添加标志来选择要使用的属性,您可以使用匿名内部类(在 java 的情况下)或内联函数(在 Javascript 的情况下)让您的排序方法是不可知的。
-
@seeta -- 感谢您的评论。通过“算法的观点”,我只是意味着我想在我正在工作的几个项目中解决这个问题(例如带有 jquery、c#、java 等的 javascript)。每个都有不同的功能可以提供帮助,但我想知道“最小公分母解决方案”可以应用于最多数量的语言而不会发生重大变化。
-
基本上你似乎想要一个Comparator(至少对于Java)。或者你想使用反射(这是相当特定于语言的)。
标签: algorithm oop design-patterns code-duplication