Menu
Coddy logo textTech

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

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

challenge icon

チャレンジ

簡単

会社の現実世界の組織構造をcompositionでエレガントにモデル化する方法を示す、employee階層システムを構築しましょう。特殊な役割が独自の動作を拡張できる、base employee typeを作成します。

コードを3つのファイルに整理します。

  • employee.goIDNameBaseSalary(float64)fieldsを含むEmployee structで基盤を作成します。次の2つのmethodを持たせます。
    • Info() string[ID] [Name]を返します
    • CalculateBonus() float64:base salaryの10%を返します
  • roles.goEmployeeをembeddedした、2つの特殊なemployee typeを作成します。
    • ManagerTeamSize field(int)を持ちます。Managerはより高いbonusを受け取ります。つまり、base salaryの20%に、team member 1人あたり$100を加えます。これを実装するためにCalculateBonus methodをshadowします。
    • DeveloperLanguage field(string)を持ちます。Developerは標準のbonusを維持しますが、表示するinfoにprogramming languageを追加するためにInfo methodを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桁でフォーマットします。

たとえば、M001Sarah Chen800005D001Alex Rivera65000Goが与えられた場合、出力は次のようになります。

M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00

Managerの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桁でフォーマット)
}

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

自分で練習してみよう: Goオンラインコンパイラ