Sorting Kotlin:排序|交换操作的位置

Sorting Kotlin:排序|交换操作的位置,sorting,kotlin,quicksort,software-design,Sorting,Kotlin,Quicksort,Software Design,我正在Kotlin中实现快速排序算法。为此,我创建了一个接口ISort,其中包含一个类型参数和一个函数sort。对于排序,我需要交换操作。我想知道这个交换函数的最佳位置是什么。我的想法是: 1) 不幸的是,在Kotlin中,无法使接口功能受到保护。因此,每个类都可以在其实现中看到交换,这并不太好(尽管我同意,这也不太坏) 2) 将它放在快速排序实现中更糟糕,因为可能有几个ISort接口实现需要交换函数 3) 我的下一个想法是创建一个单例对象,但Kotlin允许使用类型参数的对象 以下是接口定义:

我正在Kotlin中实现快速排序算法。为此,我创建了一个接口ISort,其中包含一个类型参数和一个函数sort。对于排序,我需要交换操作。我想知道这个交换函数的最佳位置是什么。我的想法是:

1) 不幸的是,在Kotlin中,无法使接口功能受到保护。因此,每个类都可以在其实现中看到交换,这并不太好(尽管我同意,这也不太坏)

2) 将它放在快速排序实现中更糟糕,因为可能有几个ISort接口实现需要交换函数

3) 我的下一个想法是创建一个单例对象,但Kotlin允许使用类型参数的对象

以下是接口定义:

interface ISort<T> {
  fun sort(toSort: MutableList<T>): MutableList<T>
  // 1) Putting swap here has a too high visibility
}
接口ISort{
有趣的排序(toSort:MutableList):MutableList
//1)将掉期放在此处的可见性太高
}
下面是QuickSort类的框架:

class QuickSort<T> : ISort<T> {
  override fun sort(toSort: MutableList<T>): MutableList<T> {
    doQuickSort(toSort) // Internally uses swap
    return toSort
  }
  // 2) Putting swap here might lead to code duplication of swap
}
类快速排序:ISort{
覆盖有趣的排序(toSort:MutableList):MutableList{
doQuickSort(toSort)//内部使用交换
返回排序
}
//2)将交换放在此处可能会导致交换的代码重复
}
因此,从软件工程的角度来看,交换操作的最佳位置是什么。

顶级功能 在文件
sort.kt

package abc.def.sort


fun <T> quicksort(list: MutableList<T>): MutableList<T> {
    ...
}

// invisible in other files, but visibie in "sort.kt"
private fun <T> swap(...) {
    ...
}


我认为[使类型参数
T
成为类类型参数,而不是函数类型参数]会使问题变得不必要的复杂,因为每次使用不同的类型
T

时,您都必须创建一个类实例,如果您包含一些代码片段,它会变得更清晰一些。我不明白你为什么需要交换功能。是
val temp=a;a=b;b=temp
不够?我更新了我的问题并添加了一些代码@Naetmul:我知道如何实现交换,但我知道它的最佳位置在哪里。我认为快速排序应该是一个顶级的通用函数。我认为创建接口和类没有任何好处。“快速排序”是一个实用功能,不需要遵循OOP范式。交换函数应该是顶级的
private
,这意味着它对声明它的文件是私有的(),相反,您可以创建一个
对象快速排序
,它包含通用的公共
sort()
和通用的私有
swap()
,但不建议使用对象作为命名空间()虽然这是Scala中很流行的一种方式。但我真不好意思没有想到使用一个抽象类。。。非常感谢你
object QuickSort {
    fun <T> sort(list: MutableList<T>): MutableList<T> {
        ...
    }

    private fun <T> swap(...) {
        ...
    }
}
object Sorts {
    fun <T> quicksort(list: MutableList<T>): MutableList<T> {
        ...
    }

    // add other sort methods...

    private fun <T> swap(...) {
        ...
    }
}
abstract class Sort {
    abstract fun <T> sort(list: MutableList<T>): MutableList<T>

    protected fun <T> swap(...) {
        ...
    }
}

object QuickSort : Sort() {
    override fun <T> sort(list: MutableList<T>): MutableList<T> {
        ...
    }
}