Golang code dedupliceren

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Golang noob hier, zit al een week te puzzelen hoe ik deze code kan vereenvoudigen.
Code nu:
Go:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package memmap

type UInteger interface {
    Value(vid uint32) (uint64, error)
    SearchValue(value uint64) (*[]uint32, error)
    SearchMinMax(min *uint64, max *uint64) (*[]uint32, error)
}

type UInteger8 struct {
    Code       string
    Min        uint8
    Max        uint8
    Unit       string
    memmap     []uint8
    length     uint32
}
type UInteger16 struct {
    Code       string
    Min        uint16
    Max        uint16
    Unit       string
    length     uint32
    memmap     []uint16
}

Nu zijn de implementaties van SearchValue bijna hetzelfde voor de 8 bit en de 16 bit variant:
Go:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
func (this UInteger8) SearchValue(value64 uint64) (*[]uint32, error) {
    var result []uint32
    if value64 <= this.AbsMax {
        value := uint8(value64)
        if value >= this.Min && value <= this.Max {
            result = make([]uint32, 0, this.length)
            for vid := uint32(0); vid < this.length; vid++ {
                if this.memmap[vid] == value {
                    result = append(result, vid)
                }
            }
        }
    }
    return &result, nil
}

func (this UInteger16) SearchValue(value64 uint64) (*[]uint32, error) {
    var result []uint32
    if value64 <= this.AbsMax {
        value := uint16(value64)
        if value >= this.Min && value <= this.Max {
            result = make([]uint32, 0, this.length)
            for vid := uint32(0); vid < this.length; vid++ {
                if this.memmap[vid] == value {
                    result = append(result, vid)
                }
            }
        }
    }
    return &result, nil
}

Het enige verschil is het casten naar uintX.
Hoe kan ik deze code herstructureren om code duplicatie te verminderen?
Is er geen interface die uint8 en uint16 bevat die ik kan gebruiken?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.

Beste antwoord (via Juup op 01-05-2021 17:35)


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 02-10 22:51

Klippy

Still Game

Wat Hydra zegt.

Maar je hebt ook wel speciale code hier. Ik zie nog niet precies wat dit voor nut kan hebben, maar tenzij je heel speciale optimalisaties aan het doen bent heb je niet echt vaak specifieke types als uint8 of uint32 nodig. Gebruik je die wel specifiek heb je inderdaad sneller last van code die dubbel lijkt omdat je types niet matchen.
Vraag me wel af waarom je search parameter een uint64 is terwijl je dit altijd naar een "kleiner" type als uint8 of uint16 gaat casten voor het zoeken.
Andersom kan je het wel wat generieker maken, cast je struct values Min en Max naar uint64
code:
1
 if value >= uint64(this.Min) && value <= uint64(this.Max)

Maar dat gebruikt natuurlijk meer geheugen en je zal altijd twee SearchValue implementaties moeten hebben omdat je de method op twee types maakt.
Je zou van alles dat je in je types nodig hebt een interface kunnen maken (dus methods Min(), Max() etc en je variabelen mix en max noemen) maar dat is omslachtig en minder efficiënt dus ik zou het lekker zo laten voor nu, beter snel dan generiek.

Verwachting is overigens dat generics in 1.18 komen, dus ongeveer eind dit jaar, als je je voorbeeld al wil testen kan je terecht op https://go2goplay.golang.org/

Nog twee andere dingen: Heb je echt een *[]uint32 nodig? Slices zijn standaard pointers. Standaard conventie is niet de naam this gebruiken.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO

Alle reacties


Acties:
  • +1 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Juup schreef op zaterdag 1 mei 2021 @ 16:25:
Hoe kan ik deze code herstructureren om code duplicatie te verminderen?
Wachten tot Generics uitkomen in Go.

https://niels.nu


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 02-10 22:51

Klippy

Still Game

Wat Hydra zegt.

Maar je hebt ook wel speciale code hier. Ik zie nog niet precies wat dit voor nut kan hebben, maar tenzij je heel speciale optimalisaties aan het doen bent heb je niet echt vaak specifieke types als uint8 of uint32 nodig. Gebruik je die wel specifiek heb je inderdaad sneller last van code die dubbel lijkt omdat je types niet matchen.
Vraag me wel af waarom je search parameter een uint64 is terwijl je dit altijd naar een "kleiner" type als uint8 of uint16 gaat casten voor het zoeken.
Andersom kan je het wel wat generieker maken, cast je struct values Min en Max naar uint64
code:
1
 if value >= uint64(this.Min) && value <= uint64(this.Max)

Maar dat gebruikt natuurlijk meer geheugen en je zal altijd twee SearchValue implementaties moeten hebben omdat je de method op twee types maakt.
Je zou van alles dat je in je types nodig hebt een interface kunnen maken (dus methods Min(), Max() etc en je variabelen mix en max noemen) maar dat is omslachtig en minder efficiënt dus ik zou het lekker zo laten voor nu, beter snel dan generiek.

Verwachting is overigens dat generics in 1.18 komen, dus ongeveer eind dit jaar, als je je voorbeeld al wil testen kan je terecht op https://go2goplay.golang.org/

Nog twee andere dingen: Heb je echt een *[]uint32 nodig? Slices zijn standaard pointers. Standaard conventie is niet de naam this gebruiken.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Klippy schreef op zaterdag 1 mei 2021 @ 17:19:
Verwachting is overigens dat generics in 1.18 komen, dus ongeveer eind dit jaar, als je je voorbeeld al wil testen kan je terecht op https://go2goplay.golang.org/
Kan je daar nu al generics testen?
Dan zal er ook wel een publieke beta van zijn... even kijken of ik die kan gebruiken.
Nog twee andere dingen: Heb je echt een *[]uint32 nodig? Slices zijn standaard pointers. Standaard conventie is niet de naam this gebruiken.
Ah fixed thx.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.