Вы не возвращаете массив, вы возвращаете Compare
, обернутый вокруг массива.Если вы намереваетесь Compare
быть прокси-сервером, перенос будет неполным, так как вы не перенаправляете стандартные операции контейнера в проксируемый массив.Кроме того, вам необходимо постоянно использовать экземпляр Compare
.В настоящее время вы иногда используете Compare
, а в других случаях используете исходный объект последовательности, например, каждый раз, когда вы передаете последовательность методу.Вместо этого используйте объект Compare
в его собственных методах.
Однако он имеет Compare
do две вещи : быть набором алгоритмов и быть последовательностью.Если вы держите объект Compare
отдельно и работаете со списком напрямую, вы можете легко переключать алгоритмы.Это более типичный подход;list.sort
работает таким образом, принимая в качестве аргумента компаратор.Вам также необходимо исправить вашу реализацию Compare
, которая использует неправильное имя переменной во многих местах (array
, когда локальная переменная называется arr
).Если вы хотите, чтобы кто-нибудь использовал вашу библиотеку, она должна быть намного лучше спроектирована.
В качестве дальнейших причин не превращать Compare
в последовательность, подумайте, что происходит, когда вам нужно изменить методы сравнения: вы заканчиваетеобернуть Compare
в другой, сделав обернутый Compare
бесполезным.
Рассмотрим подход, используемый в математике: порядок - это отношение, определенное в наборе, а не внутренняя часть набора, и особенно это не часть последовательностей элементов из набора.Это обнаруживает еще одну концептуальную ошибку с вашим оригинальным подходом: он связывает упорядочение (которое является отношением набора) с операциями над последовательностями элементов из набора.Они должны храниться отдельно, чтобы вы могли использовать разные сравнения с операциями последовательности.
Вне темы
В коде есть ряд других ошибок различных типов.Например, в SelectionSort
вы предполагаете, что ошибки типа должны быть из-за непоследовательности, передаваемой как array
.Сравнение экземпляров несопоставимых типов (таких как 0 и 'd') также приведет к ошибке типа.Для другого примера Compare.sorted
бесполезен;это имеет вид:
if test:
return True
return False
Это логически эквивалентно:
return test
, что означает Compare.sorted
эквивалентно Compare.__determine
.Сделайте последнее первым, так как sorted
- более описательное имя.«определить» слишком двусмысленно;напрашивается вопрос о том, что определяется.
Вы можете получить больше обзоров кода на codereview.stackexchange.com .