Menu
Coddy logo textTech

まとめ - 従業員の階層構造

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 40/107。

challenge icon

チャレンジ

簡単

コンポジションが現実世界の組織構造をいかにエレガントにモデル化できるかを示す、企業の従業員階層システムを構築しましょう。ベースとなる従業員型を作成し、専門的な役割が独自の動作でそれを拡張できるようにします。

コードは3つのファイルに分けて構成します:

  • employee.go: IDName、および 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桁でフォーマットしてください。

例えば、M001Sarah Chen800005D001Alex Rivera65000、および 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桁にフォーマットする)
}

オブジェクト指向プログラミングのすべてのレッスン