ولې د ګو ډیزاین د سمارټ پروګرام کونکو لپاره خراب دی

په تیرو میاشتو کې زه د تطبیق لپاره Go کاروم. د مفهوم ثبوت (نږدې: کوډ چې د یوې مفکورې د فعالیت ازموینه وکړي) په خپل وړیا وخت کې، یو څه برخه د پروګرام کولو ژبه پخپله مطالعه کوي. برنامه پخپله خورا ساده دي او د دې مقالې هدف نه دی ، مګر پخپله د Go کارولو تجربه د دې په اړه یو څو ټکي مستحق دي. ژمنې ته لاړ شه (نږدې: مقاله په 2015 کې لیکل شوې) د جدي پیمانه کوډ لپاره مشهوره ژبه. ژبه د ګوګل لخوا جوړه شوې، چیرې چې دا په فعاله توګه کارول کیږي. لاندینۍ کرښه، زه په صادقانه توګه فکر کوم چې د ګو ژبې ډیزاین د سمارټ پروګرام کونکو لپاره خراب دی.

د ضعیف پروګرامرانو لپاره ډیزاین شوی؟

Go زده کول خورا اسانه دي ، دومره اسانه چې پیژندنه ما یو ماښام واخیست ، وروسته له هغه چې ما دمخه په ګټور ډول کوډ کولی شو. هغه کتاب چې ما زده کاوه Go نومیږي په Go کې د برنامه کولو پیژندنه (ژباړه)، دا آنلاین شتون لري. کتاب، لکه د Go منبع کوډ پخپله، د لوستلو لپاره اسانه دی، د ښه کوډ مثالونه لري، او شاوخوا 150 پاڼې لري چې په یوه وخت کې لوستل کیدی شي. دا سادگي په لومړي سر کې تازه کوي، په ځانګړې توګه د پروګرام کولو نړۍ کې چې د خورا پیچلي ټیکنالوژۍ څخه ډکه ده. مګر په پای کې، ژر یا وروسته فکر راپورته کیږي: "ایا دا واقعیا داسې ده؟"

ګوګل ادعا کوي چې د Go سادګۍ د پلور نقطه ده او ژبه په لوی ټیمونو کې د اعظمي تولید لپاره ډیزاین شوې ، مګر زه پدې کې شک لرم. داسې ځانګړتیاوې شتون لري چې یا ورک دي یا ډیر تفصیل لري. او ټول په پراختیا کونکو کې د باور نشتوالي له امله ، د دې انګیرنې سره چې دوی نشي کولی سم څه وکړي. د سادګۍ لپاره دا هیله د ژبې د ډیزاینرانو لخوا یوه شعوري پریکړه وه، او د دې لپاره چې په بشپړه توګه پوه شي چې ولې ورته اړتیا وه، موږ باید د پراختیا کونکو هڅونې پوه شو او هغه څه چې دوی یې د ترلاسه کولو هڅه کوله.

نو ولې دومره ساده جوړ شو؟ دلته یو څو اقتباسات دي روب پایک (نږدې: د ګو ژبې یو له شریک جوړونکو څخه ):

دلته مهم ټکی دا دی چې زموږ پروګرام کونکي (نږدې: ګوګلرز) څیړونکي نه دي. دوی، د یوې قاعدې په توګه، خورا ځوان دي، موږ ته د مطالعې وروسته راځي، شاید دوی جاوا، یا C/C++، یا Python مطالعه کړي. دوی په عالي ژبه نه پوهیږي، مګر په ورته وخت کې موږ غواړو چې دوی ښه سافټویر جوړ کړي. له همدې امله د دوی ژبه باید د پوهیدو او زده کولو لپاره اسانه وي.
 
هغه باید آشنا وي، تقریبا د C سره ورته خبرې کوي. هغه پروګرام کونکي چې په ګوګل کې کار کوي خپل کیریر ژر پیل کوي او ډیری یې د طرزالعمل ژبو سره بلد دي، په ځانګړې توګه د C کورنۍ. په نوې برنامه ژبه کې د ګړندي تولید اړتیا پدې معنی ده چې ژبه باید خورا افراطي نه وي.

څه؟ نو روب پایک اساسا وايي چې په ګوګل کې پراختیا کونکي دومره ښه ندي ، له همدې امله دوی د احمقانو لپاره ژبه رامینځته کړې (نږدې: dumbed down) ترڅو دوی د یو څه کولو توان ولري. خپلو همکارانو ته څه ډول مغرور ښکاري؟ زه تل باور لرم چې د ګوګل پراختیا کونکي په ځمکه کې ترټولو روښانه او غوره څخه غوره شوي دي. یقینا دوی کولی شي یو څه ډیر ستونزمن اداره کړي؟

د ډیر سادګۍ اثار

ساده کیدل په هر ډیزاین کې د پام وړ هدف دی، او د یو څه ساده کولو هڅه کول ستونزمن دي. په هرصورت، کله چې د پیچلو ستونزو حل کولو (یا حتی څرګندولو) هڅه کوي، ځینې وختونه پیچلې وسیلې ته اړتیا وي. پیچلتیا او پیچلتیا د پروګرام کولو ژبې غوره ځانګړتیاوې ندي، مګر یو منځنی ځای شتون لري چې ژبه کولی شي په زړه پورې لنډیزونه رامینځته کړي چې د پوهیدو او کارولو لپاره اسانه وي.

ډیر څرګند نه دی

د سادګۍ لپاره د دې ژمنې له امله، Go داسې جوړښتونه نلري چې په نورو ژبو کې طبیعي ګڼل کیږي. دا ممکن په لومړي سر کې د یو ښه نظر په څیر ښکاري، مګر په عمل کې دا د فعل کوډ پایلې لري. د دې دلیل باید څرګند وي - دا باید د پراختیا کونکو لپاره د نورو خلکو کوډ لوستل اسانه وي ، مګر په حقیقت کې دا ساده کول یوازې لوستلو ته زیان رسوي. په Go کې هیڅ لنډیز شتون نلري: یا ډیر یا هیڅ شی.

د مثال په توګه ، د کنسول یوټیلیټ چې stdin لوستل کوي یا د کمانډ لاین دلیلونو څخه فایل به داسې ښکاري:

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)
}

که څه هم دا کوډ هڅه کوي د امکان تر حده عمومي وي، د Go جبري فعل په لاره کې راځي، او د پایلې په توګه، د یوې ساده ستونزې حل کول د کوډ لوی مقدار پایله کوي.

دلته، د بیلګې په توګه، د ورته ستونزې حل دی 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);
    }
}

او اوس څوک ډیر لوستل کیږي؟ زه به خپله رایه D ته ورکوم. د هغه کوډ ډیر د لوستلو وړ دی ځکه چې هغه عملونه په روښانه ډول بیانوي. D ډیر پیچلي مفهومونه کاروي (نږدې: د بدیل فنکشن کال и نمونهد Go مثال په پرتله، مګر د دوی د پوهیدو په اړه واقعیا هیڅ پیچلي ندي.

د کاپي کولو دوزخ

د Go ښه کولو لپاره یو مشهور وړاندیز عموميت دی. دا به لږترلږه د ټولو ډیټا ډولونو ملاتړ لپاره د کوډ غیر ضروري کاپي کولو څخه مخنیوي کې مرسته وکړي. د مثال په توګه، د انټیجرونو لیست لنډولو لپاره یو فنکشن د هر انټیجر ډول لپاره د دې بنسټیز فعالیت کاپي کولو پرته په بل ډول پلي کیدی نشي؛ بله لاره نشته:

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))
}

او دا مثال حتی د لاسلیک شوي ډولونو لپاره کار نه کوي. دا طریقه په بشپړه توګه د خپل ځان د نه تکرار کولو اصول څخه سرغړونه کوي (وچ)، یو له خورا مشهور او څرګند اصولو څخه، له پامه غورځول چې د ډیری غلطیو سرچینه ده. ولې دا کار کوي؟ دا د ژبې یو ناوړه اړخ دی.

په ورته مثال کې:

import std.stdio;
import std.algorithm;

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

ساده، ښکلی او مستقیم ټکي ته. دلته کارول شوی فعالیت دی reduce د ټیمپلیټ ډول او وړاندوینې لپاره. هو، دا بیا د Go نسخه څخه ډیر پیچلی دی، مګر د سمارټ پروګرام کونکو لپاره پوهیدل دومره ستونزمن ندي. کوم مثال د ساتلو لپاره اسانه او لوستل یې اسانه دي؟

ساده ډول سیسټم بای پاس

زه تصور کوم چې د دې لوستلو پروګرام کونکي به په خوله کې فنګس کوي او چیغې به یې کړي، "تاسو دا غلط کوئ!" ښه ، د عمومي فعالیت او ډولونو رامینځته کولو بله لاره شتون لري ، مګر دا په بشپړ ډول د ډول سیسټم ماتوي!

د ستونزې په شاوخوا کې د کار کولو لپاره د احمق ژبې فکس دې مثال ته یو نظر وګورئ:

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)
}

دا تطبیق Reduce له مقالې څخه پور اخیستل شوی په Go کې محاورې جنریک (نږدې: ما ژباړه ونه موندله، زه به خوښ شم که تاسو پدې کې مرسته وکړئ). ښه، که دا محاوره وي، زه به د غیر محاورې مثال لیدلو څخه نفرت وکړم. کارول interface{} - یو طنز، او په ژبه کې دا یوازې د ټایپ کولو څخه د وتلو لپاره اړین دی. دا یو خالي انٹرفیس دی او ټول ډولونه یې پلي کوي ، د هرچا لپاره بشپړ آزادي اجازه ورکوي. د برنامه کولو دا سټایل د دوزخ په څیر بد دی ، او دا ټول ندي. د دې په څیر اکروباټیک فیټونه د منډې وخت انعکاس کارولو ته اړتیا لري. حتی روب پایک هغه کسان نه خوښوي چې دا ناوړه ګټه پورته کوي، لکه څنګه چې هغه په ​​​​خپل راپور کې یادونه کړې.

دا یو پیاوړی وسیله ده چې باید په احتیاط سره وکارول شي. دا باید مخنیوی وشي پرته لدې چې په کلکه اړتیا وي.

زه به د دې بې معنی پر ځای D ټیمپلیټونه واخلم. دا څنګه څوک ویلای شي interface{} ډیر د لوستلو وړ یا حتی خوندي ډول ډول؟

د انحصاري مدیریت ستونزې

Go د مشهور کوربه توب چمتو کونکو په سر کې جوړ شوی انحصار سیسټم لري VCS. هغه وسیلې چې د Go سره راځي د دې خدماتو په اړه پوهیږي او کولی شي له دوی څخه کوډ ډاونلوډ ، جوړ او نصب کړي په یوځل کې. پداسې حال کې چې دا عالي دی ، د نسخې کولو سره لوی نیمګړتیا شتون لري! هو، دا ریښتیا ده چې تاسو د Go وسیلو په کارولو سره د ګیتوب یا بټ بکټ په څیر خدماتو څخه سرچینه کوډ ترلاسه کولی شئ، مګر تاسو نشئ کولی نسخه مشخص کړئ. او بیا د ګټورتوب په قیمت کې سادگي. زه د داسې پریکړې په منطق نه پوهیږم.

د دې ستونزې د حل په اړه د پوښتنو پوښتنو وروسته، د Go پرمختیا ټیم جوړ کړ د فورم موضوع، کوم چې دا په ګوته کړه چې دوی څنګه د دې مسلې شاوخوا ته ځي. د دوی سپارښتنه دا وه چې په ساده ډول یوه ورځ ټوله ذخیره ستاسو په پروژه کې کاپي کړئ او "لکه څنګه چې وي." دوی څه فکر کوي؟ موږ د عالي ټاګ کولو او نسخې ملاتړ سره د حیرانتیا نسخه کنټرول سیسټمونه لرو چې د Go جوړونکي له پامه غورځوي او یوازې د سرچینې کوډ کاپي کوي.

د شي څخه کلتوري سامان

زما په نظر، Go د هغو خلکو لخوا رامینځته شوی چې په ټول ژوند کې یې C کارولی او د هغو کسانو لخوا چې نه غواړي یو څه نوي هڅه وکړي. ژبه د اضافي څرخونو سره د C په توګه تشریح کیدی شي (orig.: د روزنې څرخ). په دې کې هیڅ نوي نظرونه شتون نلري، پرته له دې چې د موازي ملاتړ ملاتړ وکړي (کوم چې، په لاره کې، په زړه پورې دی) او دا د شرم خبره ده. تاسو په سخته توګه د کارونې وړ، ګونګه ژبه کې عالي موازي لرئ.

بله کریکینګ ستونزه دا ده چې ګو د طرزالعمل ژبه ده (لکه د C خاموش وحشت). تاسو په یو طرزالعمل سټایل کې کوډ لیکل پای ته رسوئ چې لرغونی او زوړ احساس کوي. زه پوهیږم چې د اعتراض پر بنسټ برنامه د سپینو زرو ګولۍ نه ده، مګر دا به خورا ښه وي چې توضیحات په ډولونو کې خلاص کړئ او د کیپسولیشن چمتو کړئ.

د خپلې ګټې لپاره سادگي

Go د ساده کولو لپاره ډیزاین شوی و او په دې هدف کې بریالی شو. دا د ضعیف پروګرامرانو لپاره لیکل شوی و، د ټیمپلیټ په توګه د زړې ژبې په کارولو سره. دا د ساده شیانو ترسره کولو لپاره د ساده وسیلو سره بشپړ کیږي. دا د لوستلو لپاره اسانه او کارول اسانه دي.

دا د سمارټ پروګرامرانو لپاره خورا لفظي، غیر اغیزناک، او خراب دی.

سپوږمکۍ mersinvald د سمونونو لپاره

سرچینه: www.habr.com

Add a comment