Skip to content

Commit

Permalink
Staff→Entryクラス名変更。新着順比較のための申し込み順を申し込みデータに保持するように変更し、新着順判定が正しく行えるようにした。
Browse files Browse the repository at this point in the history
  • Loading branch information
77web committed Aug 17, 2014
1 parent 9ce5c7d commit 6f0a319
Show file tree
Hide file tree
Showing 12 changed files with 144 additions and 105 deletions.
50 changes: 40 additions & 10 deletions src/Data/Staff.php → src/Data/Entry.php
Expand Up @@ -4,12 +4,21 @@
namespace Nagoya\Data;


class Staff
class Entry
{
/**
* @var int
*
* 社員番号
*/
private $staffId;

/**
* @var int
*
* 申し込み受付順
*/
private $id;
private $requestOrder;

/**
* @var array
Expand All @@ -18,15 +27,17 @@ class Staff

/**
* @param int $id
* @param int $requestOrder
*/
public function __construct($id)
public function __construct($id, $requestOrder)
{
$this->id = $id;
$this->staffId = $id;
$this->requestOrder = $requestOrder;
}

/**
* @param array $classDayRequests
* @return Staff
* @return Entry
*/
public function setClassDayRequests($classDayRequests)
{
Expand All @@ -45,21 +56,40 @@ public function getClassDayRequests()

/**
* @param int $id
* @return Staff
* @return Entry
*/
public function setStaffId($id)
{
$this->staffId = $id;

return $this;
}

/**
* @return int
*/
public function getStaffId()
{
return $this->staffId;
}

/**
* @param int $requestOrder
* @return Entry
*/
public function setId($id)
public function setRequestOrder($requestOrder)
{
$this->id = $id;
$this->requestOrder = $requestOrder;

return $this;
}

/**
* @return int
*/
public function getId()
public function getRequestOrder()
{
return $this->id;
return $this->requestOrder;
}

/**
Expand Down
14 changes: 7 additions & 7 deletions src/Data/Lesson.php
Expand Up @@ -14,7 +14,7 @@ class Lesson
private $day;

/**
* @var Staff[]
* @var Entry[]
*
* 受講する社員リスト
*/
Expand Down Expand Up @@ -68,28 +68,28 @@ public function setMembers($members)
}

/**
* @return Staff[]
* @return Entry[]
*/
public function getMembers()
{
return $this->members;
}

/**
* @param Staff $staff
* @param Entry $entry
* @return $this
*/
public function addMember(Staff $staff)
public function addMember(Entry $entry)
{
$this->members[] = $staff;
$this->members[] = $entry;

return $this;
}

public function removeMember(Staff $staff)
public function removeMember(Entry $entry)
{
foreach ($this->members as $key => $member) {
if ($member->getId() == $staff->getId()) {
if ($member->getStaffId() == $entry->getStaffId()) {
unset($this->members[$key]);
break;
}
Expand Down
4 changes: 2 additions & 2 deletions src/EnglishClass.php
Expand Up @@ -36,10 +36,10 @@ public function __construct(InputParser $inputParser, LessonGenerator $lessonGen
public function run($input)
{
// 入力文字列をStaffの配列に変換する
$staffs = $this->inputParser->convertToStaffs($input);
$entries = $this->inputParser->convertToEntries($input);

// 割り振りを行う
$lessons = $this->lessonGenerator->generate($staffs);
$lessons = $this->lessonGenerator->generate($entries);

// 出力を整える
$output = $this->outputFormatter->format($lessons);
Expand Down
28 changes: 15 additions & 13 deletions src/LessonGenerator.php
Expand Up @@ -5,7 +5,7 @@


use Nagoya\Data\Lesson;
use Nagoya\Data\Staff;
use Nagoya\Data\Entry;

class LessonGenerator
{
Expand All @@ -25,17 +25,17 @@ public function __construct(array $days = [], $memberLimit)
}

/**
* @param \Nagoya\Data\Staff[] $staffs
* @param \Nagoya\Data\Entry[] $entrys
* @return array
*/
public function generate(array $staffs)
public function generate(array $entrys)
{
$lessons = $this->initializeLessons();

// 社員をクラスに割り振る
// 社員は応募順に並べられている
foreach ($staffs as $staff) {
$this->assignStaffToLesson($staff, $lessons);
foreach ($entrys as $entry) {
$this->assignEntryToLesson($entry, $lessons);
}

// 受講生のいない枠を削除
Expand Down Expand Up @@ -63,37 +63,39 @@ private function initializeLessons()
}

/**
* @param Staff $staff
* @param Entry $entry
* @param Lesson[] $lessons
*/
private function assignStaffToLesson(Staff $staff, array $lessons)
private function assignEntryToLesson(Entry $entry, array $lessons)
{
// 希望順に各曜日の空きを見て行き、空きがあればその時点でクラスに参加させる
foreach ($staff->getClassDayRequests() as $day) {
foreach ($entry->getClassDayRequests() as $day) {
// TODO クラスの特定方法をRepositoryとかに任せる
$lesson = $lessons[$day];

if (!$lesson->isFull()) {
$lesson->addMember($staff);
$lesson->addMember($entry);
break;
} else {
// 実行時点で一番希望順位が低い社員を見つける。同じ希望順なら応募順が後の方を低いと見なす
$minimumPriorityMember = null;
foreach ($lesson->getMembers() as $member) {
/** @var Staff $minimumPriorityMember */
/** @var Entry $minimumPriorityMember */
if (null === $minimumPriorityMember || $member->getRequestRankForDay($day) >= $minimumPriorityMember->getRequestRankForDay($day)) {
$minimumPriorityMember = $member;
}
}

// 一番希望順位が低い社員が現在アサイン実行中の社員より希望順位が低ければ追い出して再アサイン
if ($minimumPriorityMember->getRequestRankForDay($day) > $staff->getRequestRankForDay($day)) {
$minRank = $minimumPriorityMember->getRequestRankForDay($day);
$rank = $entry->getRequestRankForDay($day);
if ($minRank > $rank || ($minRank == $rank && $entry->getRequestOrder() < $minimumPriorityMember->getRequestOrder())) {
$lesson
->addMember($staff)
->addMember($entry)
->removeMember($minimumPriorityMember)
;

$this->assignStaffToLesson($minimumPriorityMember, $lessons);
$this->assignEntryToLesson($minimumPriorityMember, $lessons);
break;
}
}
Expand Down
20 changes: 10 additions & 10 deletions src/Util/InputParser.php
Expand Up @@ -3,26 +3,26 @@

namespace Nagoya\Util;

use Nagoya\Data\Staff;
use Nagoya\Data\Entry;

class InputParser
{
/**
* @param string $inputs
* @return Staff[]
* @return Entry[]
*/
public function convertToStaffs($inputs)
public function convertToEntries($inputs)
{
$staffs = [];
foreach (explode('|', $inputs) as $input) {
list($id, $requests) = explode('_', $input);
$staff = new Staff($id);
$staff->setClassDayRequests($this->convertRequests($requests));
$entries = [];
foreach (explode('|', $inputs) as $order => $input) {
list($entryId, $requests) = explode('_', $input);
$entry = new Entry($entryId, $order);
$entry->setClassDayRequests($this->convertRequests($requests));

$staffs[] = $staff;
$entries[] = $entry;
}

return $staffs;
return $entries;
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/Util/OutputFormatter.php
Expand Up @@ -15,8 +15,8 @@ public function format(array $lessons)
$outputs = [];
foreach ($lessons as $lesson) {
$staffIds = [];
foreach ($lesson->getMembers() as $staff) {
$staffIds[] = $staff->getId();
foreach ($lesson->getMembers() as $entry) {
$staffIds[] = $entry->getStaffId();
}
sort($staffIds);

Expand Down
19 changes: 19 additions & 0 deletions tests/Data/EntryTest.php
@@ -0,0 +1,19 @@
<?php


namespace Nagoya\Data;


class EntryTest extends \PHPUnit_Framework_TestCase
{
public function test_getRequestRankForDay()
{
$requests = [1, 2];

$entry = new Entry(1, 1);
$entry->setClassDayRequests($requests);

$this->assertEquals(1, $entry->getRequestRankForDay(1));
$this->assertEquals(2, $entry->getRequestRankForDay(2));
}
}
19 changes: 0 additions & 19 deletions tests/Data/StaffTest.php

This file was deleted.

4 changes: 2 additions & 2 deletions tests/EnglishClassTest.php
Expand Up @@ -48,7 +48,7 @@ public function provideInputAndOutput()
['29_23541|37_32145|28_34215|59_15234|27_35142|77_51324|23_31245|62_15342|46_23145|47_41523|7_52341|68_12534|5_43251', '1_59:62:68|2_29:46|3_23:27:28:37|4_5:47|5_7:77'],
['17_34152|89_23451|49_43152|61_32541|15_25413|63_34521|16_31452|8_41352|54_41532|42_34521|53_12453|88_34251|4_21453|93_34512|18_25134|67_25134|50_14523', '1_50:53|2_4:15:18:89|3_16:17:61:63|4_8:42:49:54|5_67:88:93'],
['10_23145|80_32154|41_41532|20_31254|96_45231|50_23514|28_12534|13_31425|52_12435|88_23541|69_34215|46_53241|22_24531|53_42351|84_15243|97_14352|8_24135|59_13524', '1_28:52:84:97|2_10:22:50:88|3_13:20:69:80|4_8:41:53:96|5_46:59'],
// ['90_21453|58_43521|69_42351|12_51432|34_14352|23_45321|77_35421|71_24531|95_24153|49_13254|9_45231|78_21534|15_43512|54_41532|52_54321|59_24513|57_41532|75_35214|24_12435|97_52341|39_12453|53_12435|48_51234|32_51234', '1_24:34:39:49|2_71:78:90:95|3_15:54:75:77|4_9:23:58:69|5_12:48:52:97'],
['90_21453|58_43521|69_42351|12_51432|34_14352|23_45321|77_35421|71_24531|95_24153|49_13254|9_45231|78_21534|15_43512|54_41532|52_54321|59_24513|57_41532|75_35214|24_12435|97_52341|39_12453|53_12435|48_51234|32_51234', '1_24:34:39:49|2_71:78:90:95|3_15:54:75:77|4_9:23:58:69|5_12:48:52:97'],
['99_42153|44_42351|88_14523|58_51234|82_14523|15_25134|74_25134|77_32145|60_13425|46_34512|45_12345|63_32145|98_15234|96_41325|38_43521|61_14325|26_21543|37_24153|40_31542|57_23415|97_12543|30_45231|56_41523|22_34512|83_31245|86_35412|16_54321', '1_45:60:82:88|2_15:26:37:74|3_40:46:63:77|4_38:44:96:99|5_16:30:58:98'],
['55_13524|64_41523|40_23451|99_25314|65_21453|69_31524|77_45231|62_51432|21_13542|81_13452|66_21534|33_41352|5_52314|90_31452|6_42135|93_42351|84_43125|54_45213|76_21453|19_52134|50_21435|61_13542|30_35421|43_25431|24_25341|31_15234|39_15243|20_51423|67_13524', '1_21:55:61:81|2_40:65:66:99|3_30:69:84:90|4_6:33:64:77|5_5:19:20:62'],
];
Expand All @@ -69,7 +69,7 @@ public function test_run()

$inputParser
->expects($this->once())
->method('convertToStaffs')
->method('convertToEntries')
->with($this->equalTo($input))
->will($this->returnValue([$staff1]))
;
Expand Down

0 comments on commit 6f0a319

Please sign in to comment.