Kihagyás

Dependency Inversion Principle

This one sounds tricky but basically is a class shall depend on abstraction rather than on concrete classes

The most generic solution is the best solution.

Of course some kind of constrains might be necessary, but that's what interfaces are for...

class NumericHolder<T :Number>{
    lateinit var theThing:T

    /**
     * The T:Number constraint was needed to convert to int,
     * but we are as generic as possible
     */
    fun isZero():Boolean{
        return theThing.toInt() == 0
    }
    /*...*/
}

This is like back in the Haskell days you should code as generic as literally possible splitOn :: Eq a => [a] -> [a] -> [[a]]