I like to check the preconditions of a function explicitly by means of code 
(instead of only documenting them). Of course this incurs a time-penalty. 

When being extremely cautious every function in a call-chain will always 
check its preconditions. But for a function down in the call-chain, the 
precondition checks of all its callers might already guarantee that its own 
pre-condition checks will never be violated. And thus these checks down the 
chain are unnecessary cpu cycles. 

Do there exist tools/methods to detect this and auto-remove these 
precondition checks? 

For example: 
the function Muladd below verifies that all arrays have the same length. 
Muladd relies on two functions to perform the `mul` and the `add` and each 
of these will also verify their respective preconditions explicitly. Given 
these functions are not exported and given these functions are only called 
by `muladd`, the compiler might be able to determine that the precondition 
checks are guaranteed to be valid and can thus be removed. 

https://go.dev/play/p/92isKKx-vYx

package main

import "fmt"

func main() {
    x := []float64{1.0, 2.0, 3.0}
    y := []float64{1.0, 2.0, 3.0}
    z := []float64{1.0, 2.0, 3.0}
    Muladd(x, y, z)
    fmt.Printf("%+v", x)
}

func Muladd(x []float64, y []float64, z []float64) error {
    // check precondition (but unnecessary if only called by Muladd)
    if len(x) != len(y) || len(x) != len(z) {
        return fmt.Errorf("slices have different lengths %d vs %d vs %d", 
len(x), len(y), len(z))
    }
    mul(x, y)
    add(x, z)
    return nil
}

func mul(x []float64, y []float64) error {
    // check precondition
    if len(x) != len(y) {
        return fmt.Errorf("slices have different lengths %d vs %d", len(x), 
len(y))
    }
    
    for i := range x {
        x[i] *= y[i]
    }
    return nil
}

func add(x []float64, y []float64) error {
    // check precondition
    if len(x) != len(y) {
        return fmt.Errorf("slices have different lengths %d vs %d", len(x), 
len(y))
    }
    
    for i := range x {
        x[i] += y[i]
    }
    return nil
}

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/a1806c94-a605-4c8b-a78f-9e40c1a6098dn%40googlegroups.com.

Reply via email to