Poukisa Go Design pa bon pou pwogramasyon entelijan yo

Pandan mwa ki sot pase yo, mwen te itilize Go pou aplikasyon yo. Prèv Konsèp (approx.: kòd pou teste fonksyonalite yon lide) nan tan lib li, an pati pou etidye langaj pwogram nan tèt li. Pwogram yo tèt yo trè senp epi yo pa objektif atik sa a, men eksperyans nan sèvi ak Go tèt li merite kèk mo sou li. Ale pwomèt yo dwe (approx.: atik ekri nan 2015) yon lang popilè pou kòd serye évolutive. Lang lan te kreye pa Google, kote li aktivman itilize. Anba liy, mwen onètman panse ke konsepsyon an nan lang Go se move pou pwogramasyon entelijan.

Ki fèt pou pwogramasyon fèb?

Go se trè fasil yo aprann, tèlman fasil ke entwodiksyon an te pran m 'yon aswè, apre sa mwen te kapab deja kòd pwodiktif. Liv mwen te konn aprann Go a rele Yon Entwodiksyon nan Programming nan Go (tradiksyon), li disponib sou entènèt. Liv la, tankou kòd sous Go li menm, fasil pou li, gen bon egzanp kòd, epi li gen apeprè 150 paj ki ka li nan yon sèl kou. Senplisite sa a se entérésan nan premye, espesyalman nan yon mond pwogramasyon ki ranpli ak teknoloji ki twò konplike. Men, alafen, pi bonè oswa pita panse a rive: "Èske sa vrèman konsa?"

Google reklamasyon senplisite Go a se pwen vann li yo ak lang lan fèt pou pwodiktivite maksimòm nan ekip gwo, men mwen gen dout li. Gen karakteristik ki swa manke oswa twò detaye. Ak tout paske nan yon mank de konfyans nan devlopè, ak sipozisyon an ke yo pa kapab fè anyen byen. Dezi sa a pou senplisite se te yon desizyon konsyan pa konsèpteur lang nan, epi yo nan lòd yo byen konprann poukisa li te nesesè, nou dwe konprann motivasyon an nan devlopè yo ak sa yo te ap eseye reyalize nan Go.

Se konsa, poukisa li te fè senp konsa? Isit la yo se yon koup nan quotes Rob Pike (approx.: youn nan ko-kreyatè lang Go a):

Pwen kle isit la se ke pwogramè nou yo (approx.: Googler yo) yo pa chèchè. Yo, kòm yon règ, byen jèn, vin jwenn nou apre yo fin etidye, petèt yo etidye Java, oswa C/C++, oswa Python. Yo pa ka konprann yon gwo lang, men an menm tan nou vle yo kreye bon lojisyèl. Se poutèt sa lang yo ta dwe fasil pou yo konprann ak aprann.
 
Li ta dwe abitye, apeprè pale menm jan ak C. Pwogramasyon k ap travay nan Google kòmanse karyè yo byen bonè epi yo sitou abitye ak lang pwosedi yo, an patikilye fanmi C. Egzijans pou pwodiktivite rapid nan yon nouvo langaj pwogramasyon vle di ke lang lan pa ta dwe twò radikal.

Kisa? Se konsa, Rob Pike se fondamantalman di ke devlopè yo nan Google yo pa sa ki bon, se poutèt sa yo te kreye yon lang pou moun sòt (approx.: dumbed desann) pou yo kapab fè yon bagay. Ki kalite arogan gade pwòp kòlèg ou yo? Mwen te toujou kwè ke devlopè Google yo chwazi sou men nan pi klere ak pi bon sou Latè. Se vre wi yo ka okipe yon bagay ki pi difisil?

Artifacts nan senplisite twòp

Pou ou kab vin senp se yon objektif ki merite nan nenpòt konsepsyon, epi eseye fè yon bagay senp se difisil. Sepandan, lè w ap eseye rezoud (oswa menm eksprime) pwoblèm konplèks, pafwa yo bezwen yon zouti konplèks. Konpleksite ak konplisite se pa pi bon karakteristik nan yon langaj pwogramasyon, men gen yon mwayen nan ki lang nan ka kreye abstraksyon elegant ki fasil pou konprann ak itilize.

Pa trè ekspresif

Akòz angajman li nan senplisite, Go manke konstriksyon ki yo pèrsu kòm natirèl nan lòt lang. Sa a ka sanble tankou yon bon lide nan premye, men nan pratik li rezilta nan kòd pwolib. Rezon ki fè sa a ta dwe evidan - li bezwen fasil pou devlopè yo li kòd lòt moun, men an reyalite senplifikasyon sa yo sèlman mal lizibilite. Pa gen okenn abrevyasyon nan Go: swa anpil oswa pa gen anyen.

Pou egzanp, yon sèvis piblik konsole ki li stdin oswa yon dosye ki soti nan agiman liy lòd ta sanble sa a:

package main

import (
    "bufio"
    "flag"
    "fmt"
    "log"
    "os"
)

func main() {

    flag.Parse()
    flags := flag.Args()

    var text string
    var scanner *bufio.Scanner
    var err error

    if len(flags) > 0 {

        file, err := os.Open(flags[0])

        if err != nil {
            log.Fatal(err)
        }

        scanner = bufio.NewScanner(file)

    } else {
        scanner = bufio.NewScanner(os.Stdin)
    }

    for scanner.Scan() {
        text += scanner.Text()
    }

    err = scanner.Err()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(text)
}

Malgre ke kòd sa a tou ap eseye jeneral ke posib, verbosity fòse Go a vin nan chemen an, ak kòm yon rezilta, rezoud yon pwoblèm senp rezilta nan yon gwo kantite kòd.

Isit la, pou egzanp, se yon solisyon a menm pwoblèm nan D:

import std.stdio, std.array, std.conv;

void main(string[] args)
{
    try
    {
        auto source = args.length > 1 ? File(args[1], "r") : stdin;
        auto text   = source.byLine.join.to!(string);

        writeln(text);
    }
    catch (Exception ex)
    {
        writeln(ex.msg);
    }
}

Ak ki moun ki pi lizib kounye a? Mwen pral bay vòt mwen an D. Kòd li a pi lizib paske li dekri aksyon yo pi klè. D itilize konsèp ki pi konplèks (approx.: apèl fonksyon altènatif и modèl) pase nan egzanp Go a, men pa gen vrèman anyen konplike sou konprann yo.

Lanfè kopye

Yon sijesyon popilè pou amelyore Go se jeneralite. Sa a pral omwen ede evite kopi ki pa nesesè nan kòd sipòte tout kalite done. Pa egzanp, yon fonksyon pou rezime yon lis nonm antye pa ka aplike nan okenn lòt fason ke pa kopye-kole fonksyon debaz li pou chak kalite nonb antye relatif; pa gen okenn lòt fason:

package main

import "fmt"

func int64Sum(list []int64) (uint64) {
    var result int64 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int32Sum(list []int32) (uint64) {
    var result int32 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int16Sum(list []int16) (uint64) {
    var result int16 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int8Sum(list []int8) (uint64) {
    var result int8 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func main() {

    list8  := []int8 {1, 2, 3, 4, 5}
    list16 := []int16{1, 2, 3, 4, 5}
    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(int8Sum(list8))
    fmt.Println(int16Sum(list16))
    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

Ak egzanp sa a pa menm travay pou kalite siyen. Apwòch sa a konplètman vyole prensip pou pa repete tèt ou (DRY), youn nan prensip ki pi popilè ak evidan, inyore ki se sous anpil erè. Poukisa Go fè sa? Sa a se yon aspè terib nan lang.

Menm egzanp sou D:

import std.stdio;
import std.algorithm;

void main(string[] args)
{
    [1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}

Senp, elegant ak dwat nan pwen an. Fonksyon an itilize isit la se reduce pou kalite modèl ak predi. Wi, sa a se ankò pi konplike pase vèsyon an Go, men se pa sa ki difisil pou pwogramasyon entelijan yo konprann. Ki egzanp ki pi fasil pou kenbe ak pi fasil pou li?

Senp tip sistèm kontoune

Mwen imajine pwogramasyon Go yo k ap li sa a pral mous nan bouch la epi yo ap kriye, "Ou ap fè li mal!" Oke, gen yon lòt fason yo fè yon fonksyon jenerik ak kalite, men li konplètman kraze sistèm nan kalite!

Gade egzanp sa a nan yon ranje lang estipid pou rezoud pwoblèm nan:

package main

import "fmt"
import "reflect"

func Reduce(in interface{}, memo interface{}, fn func(interface{}, interface{}) interface{}) interface{} {
    val := reflect.ValueOf(in)

    for i := 0; i < val.Len(); i++ {
        memo = fn(val.Index(i).Interface(), memo)
    }

    return memo
}

func main() {

    list := []int{1, 2, 3, 4, 5}

    result := Reduce(list, 0, func(val interface{}, memo interface{}) interface{} {
        return memo.(int) + val.(int)
    })

    fmt.Println(result)
}

Aplikasyon sa a Reduce te prete nan atik la Jenerik idiomatik nan Go (approx.: Mwen pa t 'kapab jwenn tradiksyon an, mwen pral kontan si ou ede ak sa a). Oke, si li nan idyomatik, mwen ta rayi wè yon egzanp ki pa idyomatik. Itilizasyon interface{} - yon fars, ak nan lang lan li nesesè sèlman kontoune sezisman. Sa a se yon koòdone vid ak tout kalite aplike li, ki pèmèt libète konplè pou tout moun. Sa a style nan pwogramasyon se fò anpil lèd, e sa a se pa tout. Fè akrobatik tankou sa yo mande pou yo sèvi ak refleksyon ègzekutabl. Menm Rob Pike pa renmen moun ki abize sa a, jan li te mansyone nan youn nan rapò li yo.

Sa a se yon zouti pwisan ki ta dwe itilize ak prekosyon. Li ta dwe evite sof si sa nesesè.

Mwen ta pran modèl D olye de istwa san sans sa a. Ki jan yon moun ka di sa interface{} plis lizib oswa menm tape san danje?

Malè Jesyon Depandans yo

Go gen yon sistèm depandans bati sou tèt founisè hosting popilè v. Zouti ki vini ak Go yo konnen sou sèvis sa yo epi yo ka telechaje, bati, ak enstale kòd nan men yo nan yon sèl kou. Pandan ke sa a se gwo, gen yon gwo defo ak vèsyon! Wi, se vre ke ou ka jwenn kòd sous la nan sèvis tankou github oswa bitbucket lè l sèvi avèk zouti Go, men ou pa ka presize vèsyon an. Epi ankò senplisite nan depans lan nan itilite. Mwen pa kapab konprann lojik yon desizyon konsa.

Apre yo fin poze kesyon sou yon solisyon a pwoblèm sa a, ekip devlopman Go te kreye fil fowòm, ki dekri kijan yo te pral jwenn alantou pwoblèm sa a. Rekòmandasyon yo se te tou senpleman kopye tout depo a nan pwojè ou a yon jou epi kite li "jan li ye." Kisa yo panse? Nou gen sistèm kontwòl vèsyon etonan ak gwo balisaj ak sipò vèsyon ke kreyatè Go yo inyore epi jis kopye kòd sous la.

Bagaj kiltirèl soti nan Xi

Dapre mwen, Go te devlope pa moun ki te itilize C tout lavi yo ak pa moun ki pa t 'vle eseye yon bagay nouvo. Lang lan ka dekri kòm C ak wou siplemantè (orig.: wou fòmasyon). Pa gen okenn nouvo lide ladan l, eksepte pou sipò pou paralelis (ki, nan chemen an, se bèl bagay) ak sa a se yon wont. Ou gen yon paralèl ekselan nan yon lang ki apèn ka itilize, k ap bwete.

Yon lòt pwoblèm krake se ke Go se yon langaj pwosedi (tankou laterè an silans nan C). Ou fini ekri kòd nan yon style pwosedi ki santi l akayik ak demode. Mwen konnen pwogram oryante objè se pa yon bal an ajan, men li ta bon pou kapab abstrè detay yo nan kalite epi bay ankapsulasyon.

Senplisite pou pwòp benefis ou

Go te fèt yo dwe senp epi li reyisi nan objektif sa a. Li te ekri pou pwogramasyon fèb, lè l sèvi avèk yon ansyen lang kòm yon modèl. Li vini konplè ak zouti senp pou fè bagay ki senp. Li fasil pou li epi li fasil pou itilize.

Li trè verbose, enpresyonan, ak move pou pwogramasyon entelijan.

Mèsi mersinvald pou modifye

Sous: www.habr.com

Add nouvo kòmantè