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

我在Kotlin中实现了Quicksort算法。 为此,我使用类型参数和单个函数( sort)创建了一个接口ISort 。 为了排序,我需要交换操作。 我想知道这个交换功能的最佳位置是什么。 我的想法:

1)不幸的是,在Kotlin中,不能使接口功能得到保护。 因此,每个班级都可以在其实施中看到交换,这并不太好(尽管也不算太差,我同意)。

2)把它放在QuickSort实现中更糟,因为可能有几个需要交换功能的ISort接口的实现。

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

这里是接口定义:

interface ISort<T> { fun sort(toSort: MutableList<T>): MutableList<T> // 1) Putting swap here has a too high visibility } 

这里是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 } 

所以,从软件工程的角度来看,交换操作的最佳位置是什么。

顶级功能

在一个文件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(...) { ... } 

要使用其他类型的swap功能,您需要在同一个文件中定义其他排序功能。 (或多次复制swap功能。)

这被推荐用于非常简单的功能。

对象作为命名空间

这与上面的方法类似,但是比以前的方法更多的OOP。

 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(...) { ... } } 

但是,在Kotlin( 顶层声明的最佳实践 )中不推荐这样做。

抽象类与对象的结合

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> { ... } } 

我认为[使类型参数T是类类型参数,而不是函数类型参数]将使问题不必要地更复杂,因为每次使用不同的类型T时都必须创建一个类实例。