algorithm - 在对不同的对象属性执行操作时避免重复代码

标签 algorithm oop design-patterns code-duplication

我最近遇到了一个让我一直在思考的问题。假设我有一个 O 类型的对象,其属性为 O.A 和 O.B。还假设我有一组 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),但这仍然是我目前的想法。

问题:实现这个方法的最佳方式是什么?我必须实现的逻辑很难分解成更小的方法,因为它已经相当优化了。问题的根源在于我需要使用对象的不同属性执行相同的操作。我想远离使用代码/标志/等。在方法签名中 if possible 以便解决方案尽可能稳健。

注意:在回答这个问题时,请从算法的角度来看待它。我知道某些特定于语言的功能可能是合适的替代方案,但我以前遇到过这个问题,并且想从相对与语言无关的角度来理解它。另外,请不要将响应限制为仅对排序解决方案进行响应,因为我只是选择它作为示例。真正的问题是如何在对对象的两个不同属性执行相同操作时避免代码重复。

最佳答案

“真正的问题是如何在对一个对象的两个不同属性执行相同的操作时避免代码重复。”

这是一个非常好的问题,因为这种情况一直存在。我认为,处理这种情况的最佳方法之一是使用以下模式。

public class O {
    int A;
    int B;
}

public doOperationX1() {
   doOperationX(something to indicate which property to use);
}

public doOperationX2() {
   doOperationX(something to indicate which property to use);
}
private doOperationX(input ) {
     // actual work is done here
}

在这种模式中,实际的实现是在私有(private)方法中执行的,该方法由公共(public)方法调用,并带有一些额外信息。例如,在这种情况下,它可以是 doOperationX(A),或 doOperationX(B),或类似的东西。

我的推理:在我看来,这种模式是最佳的,因为它满足了两个主要要求:

  1. 它保持公共(public)接口(interface)的描述性和清晰性,因为它保持操作独立,并避免您在帖子中也提到的标志等。这对客户有好处。

  2. 从实现的角度来看,它避免了重复,因为它在一个地方。这有利于发展。

关于algorithm - 在对不同的对象属性执行操作时避免重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16898736/

相关文章:

c++无法通过指向该对象的指针将指针分配给该对象

c++ - 使用 protected 方法而不是为继承树中的每个派生类创建新的虚函数是一种好习惯吗?例如。在描述中

c# - C# 中的绑定(bind)/链接对象/类,如 LINQ

c - 了解快速求幂函数

algorithm - 哪个算法支配 f(n) 或 (g(n)

design-patterns - 责任链 VS 案例陈述

iphone - 带有 Web 服务的核心数据推荐模式?

c# - 使用 C# 在生成器设计模式中集成序列化和反序列化

php - 在 PHP 中快速查找数据的方法

arrays - 给定数组部分已排序部分未排序,如何找到特定元素?