まとめ - 従業員の階層構造
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 40/107。
チャレンジ
簡単会社の現実世界の組織構造をcompositionでエレガントにモデル化する方法を示す、employee階層システムを構築しましょう。特殊な役割が独自の動作を拡張できる、base employee typeを作成します。
コードを3つのファイルに整理します。
employee.go:ID、Name、BaseSalary(float64)fieldsを含むEmployeestructで基盤を作成します。次の2つのmethodを持たせます。Info() string:[ID] [Name]を返しますCalculateBonus() float64:base salaryの10%を返します
roles.go:Employeeをembeddedした、2つの特殊なemployee typeを作成します。Manager:TeamSizefield(int)を持ちます。Managerはより高いbonusを受け取ります。つまり、base salaryの20%に、team member 1人あたり$100を加えます。これを実装するためにCalculateBonusmethodをshadowします。Developer:Languagefield(string)を持ちます。Developerは標準のbonusを維持しますが、表示するinfoにprogramming languageを追加するためにInfomethodをshadowします:[ID] [Name] ([Language])
main.go:inputからemployee detailsを読み取り、1つのManagerと1つのDeveloperを作成し、それぞれのemployeeのinfoと計算されたbonusを表示します。
次のinputが提供されます。
- Line 1:Manager ID
- Line 2:Manager name
- Line 3:Manager base salary(float64)
- Line 4:Manager team size(integer)
- Line 5:Developer ID
- Line 6:Developer name
- Line 7:Developer base salary(float64)
- Line 8:Developer programming language
各employeeについて、infoを出力し、その次の行にbonusを出力します。bonusは小数点以下2桁でフォーマットします。
たとえば、M001、Sarah Chen、80000、5、D001、Alex Rivera、65000、Goが与えられた場合、出力は次のようになります。
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00Managerのbonus calculation(20% of 80000 + 5×100 = 16500)がDeveloperの標準的な10%のbonusと異なる一方で、Developerはinfoの表示方法をカスタマイズしていることに注目してください。どちらのtypeもembeddedされたEmployee fieldsに引き続きaccessでき、必要に応じて元のmethodを呼び出せます。
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Managerの詳細を読み取る
managerID, _ := reader.ReadString('\n')
managerID = strings.TrimSpace(managerID)
managerName, _ := reader.ReadString('\n')
managerName = strings.TrimSpace(managerName)
managerSalaryStr, _ := reader.ReadString('\n')
managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)
teamSizeStr, _ := reader.ReadString('\n')
teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))
// Developerの詳細を読み取る
devID, _ := reader.ReadString('\n')
devID = strings.TrimSpace(devID)
devName, _ := reader.ReadString('\n')
devName = strings.TrimSpace(devName)
devSalaryStr, _ := reader.ReadString('\n')
devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)
devLanguage, _ := reader.ReadString('\n')
devLanguage = strings.TrimSpace(devLanguage)
// TODO: 読み取った値を使用してManagerを作成する
// Hint: コンポジションを使用する - ManagerはEmployeeを埋め込む
// TODO: 読み取った値を使用してDeveloperを作成する
// Hint: コンポジションを使用する - DeveloperはEmployeeを埋め込む
// TODO: マネージャーの情報とボーナスを出力する(ボーナスは小数点以下2桁でフォーマット)
// フォーマットにはfmt.Printfと"%.2f"を使用する
// TODO: デベロッパーの情報とボーナスを出力する(ボーナスは小数点以下2桁でフォーマット)
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ