Help us understand the problem. What is going on with this article?

パッケージシステムを意識した今時、Hello Worldを紹介してみたり

More than 1 year has passed since last update.

Hello World!の次のステップHello Servant!

プログラミング学習を進める上の最初のステップ
「Hello World」
これは、今も昔も変わらずやりますよね?

でも、モダンなプログラミングというのは
パッケージ、、、パッケージ
とにかくパッケージ
パッケージシステムを制する者は
モダンプログラミングを制すると言っても過言ではありません。

ということで今回は、モダンプログラミング版「Hello World」ということで
「Hello Servant」という学習手法を提案したいと思います。

流行りのGo言語

まずは、普通にHello World

main.go
package main

import (
    "fmt"
)

func main()  {
    fmt.Println("Hello World")
}
go run main.go
-> Hello World

それではパッケージシステム向け「Hello World」
「Hello Servant」をやってみます。
プロジェクトルートに「servant」というディレクトリを作って
まぁ「Hello World」と挨拶する「servant」ということなので
挨拶人という意味合いで
「Greeter」というパッケージを作ってみましょう。

mkdir -p servant/Greeter
touch servant/Greeter/Greeter.go
servant/Greeter/Greeter.go
package Greeter

import (
    "fmt"
)

type Greeter struct {}


func Summon() *Greeter {
    return &Greeter{}
}

func (g *Greeter) ServeHello() {
    fmt.Println("Hello Servant!")
}

main.goも下記のように書き換えます。

main.go
package main

import (
    "<go mod init時に付けたモジュール名>/servant/Greeter"
)

func main()  {
    //Greeterを召喚!!
    greeter := Greeter.Summon()
    //service実行!!
    greeter.ServeHello()
}
go run main.go
-> Hello Servant!

Go言語ではこんな感じでパッケージシステム版「Hello World」が出来ました。

流行りのPython

ディレクトリ構造はこんな感じ

.
├── main.py
└── servant
    ├── Greeter.py
    └── __init__.py
servant/Greeter.py
class Summon:
    def __init__(self):
        self.message = "Hello Servant!"

    def serve_hello(self):
        print(self.message)

main.py
from servant import Greeter

# Greeterを召喚!!
greeter = Greeter.Summon()
# service実行!!
greeter.serve_hello()
python main.py
-> Hello Servant!

TypeScriptでもやってみる

まぁ、TypeScriptなんで一応、distディレクトリも含めてこんな感じ

.
├── dist
│   ├── main.js
│   └── main.js.map
└── src
    ├── main.ts
    └── servant
        └── Greeter.ts

src/servant/Greeter.ts
export module Greeter {
    export class Summon {
        constructor() {}
        serveHello(): void {
            console.log('hello Servant!')
        }
    }
}

src/main.ts
import { Greeter } from './servant/Greeter'

const greeter = new Greeter.Summon()

greeter.serveHello()
parcel build src/main.ts
node dist/main.js

-> Hello Servant!

まとめ

結構、プログラミングの学習って
「Hello World」やった後
アプリ開発に挑戦してみるというところの間に
だいぶ、隔たりがあるので学習に苦労しているという人も多いのでは
無いでしょうか?

この「Hello Servant」は
この後、例えば

main.go
greeter := Greeter.Summon("山田 太郎")
greeter.ServeHello()
-> Hello 山田 太郎

というのをやってみたり
Scraperというservantを作って
例えば、スポーツ選手の一覧掲載してるサイトから
スポーツ選手名一覧を引っ張ってきて
スポーツ選手の国籍に応じてその国の言葉で挨拶するGreeterを作ってみたり

普通のHello Worldよりかなり練習の幅が広がるのでは無いでしょうか?

ちなみにこの「servant」という設計思想は
遊戯王カードとかカードゲームをやったことある人と非常に相性の良い設計思想です。
「Summon(召喚)」とか言ってるくらいですからね。
そして、スクレイピングみたいにweb上からデータを取ってくるのも
感覚的に遊戯王カードとかの「フィールド上の〇〇を」みたいな感覚と似てますよね。
プログラミングをすること自体がもうカードゲームをプレイしているような感覚で楽しくなってきます。

Inadati
現在、k8sを勉強中 勉強に集中気味なので投稿少なめです。 今後、k8sでこんなんやってみたというのがかけるレベルになったら再開するかも 文章書くのはあまり得意ではないので訳わからん内容だったら申し訳ない...
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away