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
时都必须创建一个类实例。