post Image
【初心者向け】ダックタイピング についての覚書

はじめに

ダックタイピングは、巷ではよく「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」
と表現されます。どういうことなのでしょうか。
Go言語で簡単なソースをコーディングしてみました。コメントベースで追っていきましょう。

ソース


package main

import "fmt"

// Fish interfaceは Swimメソッドを持つ。
type Fish interface {
    Swim() string
}

// Bird interfaceは Flyメソッドを持つ。
type Bird interface {
    Fly() string
}

// アヒルは泳げるし、少し飛べる。
// それらを踏まえて Duck ストラクトを定義する。
type Duck struct {
    duckSwim string
    duckFly  string
}

// Duck ストラクトにSwimメソッドを持たせる。
func (d *Duck) Swim() string {
    return d.duckSwim
}

// Duck ストラクトにFlyメソッドを持たせる。
func (d *Duck) Fly() string {
    return d.duckFly
}

// このFishSwim関数は Fish interface以外の引数は取らない
func FishSwim(f Fish) string {
    return f.Swim()
}

// このBirdFly関数は Bird interface 以外の引数は取らない
func BirdFly(b Bird) string {
    return b.Fly()
}

func main() {
    // 先程定義したストラクト Duckに文字列をセット
    dc := &Duck{
        "私は泳げます。",
        "私は飛べます。",
    }

    // アヒルなので、泳げる。
    fmt.Println(dc.Swim())
    // アヒルなので、飛べる。
    fmt.Println(dc.Fly())

    // FishSwim関数の引数はFishのみのはずだが、Duckを渡すと泳げると言う。
    fmt.Println(
        "SaySwim :",
        FishSwim(dc),
    )

    // BirdFly関数の引数はBirdのみのはずだが、Duckを渡すと飛べると言う。
    fmt.Println(
        "SayFry :",
        BirdFly(dc),
    )
}

まとめ

引数にFishしか受け取らないはずのFishSwim関数と
引数にBirdしか受け取らないはずのBirdFly関数が
Duckストラクトを受け取って「飛べる」とか「泳げる」とか言えるようになりました。
インターフェイス型のFish,Birdが必要なメソッドを持っていたからですね。
オブジェクトの振る舞いが問題なければ、
それを必要な引数として取り扱える事が
ダックタイピングの概要でしょうか。


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。