まとめ - 従業員の階層構造
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 40/107。
チャレンジ
簡単コンポジションが現実世界の組織構造をいかにエレガントにモデル化できるかを示す、企業の従業員階層システムを構築しましょう。ベースとなる従業員型を作成し、専門的な役割が独自の動作でそれを拡張できるようにします。
コードは3つのファイルに分けて構成します:
employee.go:ID、Name、およびBaseSalary(float64) フィールドを持つEmployee構造体で基礎を作成します。次の2つのメソッドを実装してください:Info() string:[ID] [Name]を返します。CalculateBonus() float64: 基本給の10%を返します。
roles.go:Employeeを埋め込んだ2つの専門的な従業員型を作成します:Manager:TeamSizeフィールド (int) を持ちます。マネージャーはより高いボーナスを受け取ります(基本給の20% + チームメンバー1人につき$100)。これを実装するためにCalculateBonusメソッドをシャドウイングしてください。Developer:Languageフィールド (string) を持ちます。デベロッパーは標準のボーナスを維持しますが、Infoメソッドをシャドウイングしてプログラミング言語を追記するようにします:[ID] [Name] ([Language])
main.go: 入力から従業員の詳細を読み取り、ManagerとDeveloperを1人ずつ作成し、各従業員の情報と計算されたボーナスを表示します。
以下の入力が提供されます:
- 1行目: マネージャーのID
- 2行目: マネージャーの名前
- 3行目: マネージャーの基本給 (float64)
- 4行目: マネージャーのチームサイズ (integer)
- 5行目: デベロッパーのID
- 6行目: デベロッパーの名前
- 7行目: デベロッパーの基本給 (float64)
- 8行目: デベロッパーのプログラミング言語
各従業員について、情報を表示し、次の行にボーナスを表示してください。ボーナスは小数点以下2桁でフォーマットしてください。
例えば、M001、Sarah Chen、80000、5、D001、Alex Rivera、65000、および Go が与えられた場合、出力は以下のようになります:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00マネージャーのボーナス計算(80000の20% + 5×100 = 16500)がデベロッパーの標準的な10%ボーナスとどのように異なるか、またデベロッパーが情報の表示方法をどのようにカスタマイズしているかに注目してください。どちらの型も、埋め込まれた Employee フィールドにアクセスでき、必要に応じて元のメソッドを呼び出すことができます。
自分で試してみよう
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: manager の情報とボーナスを出力する(ボーナスは小数点以下2桁にフォーマットする)
// フォーマットには fmt.Printf と "%.2f" を使用する
// TODO: developer の情報とボーナスを出力する(ボーナスは小数点以下2桁にフォーマットする)
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー