Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 38 additions & 5 deletions Implementation/Common/Name.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,59 @@
/// <summary>
/// Скрытая реализация представления об имени человека.
/// </summary>
internal struct Name
public struct Name : IName
{
/*
* TODO #1: Реализуйте интерфейс IName для структуры Name
*/
/// <summary>
/// Полная форма имени.
/// </summary>
public string FullName { get; }
/// <summary>
/// Короткая форма имени.
/// </summary>
public string ShortName { get; }

/// <summary>
/// Имя.
/// </summary>
public string FirstName { get; }

/// <summary>
/// Фамилия.
/// </summary>
public string Surname { get; }

/// <summary>
/// Отчество.
/// </summary>
public string Patronymic { get; }


public Name(IName name)
{
FullName = name.FullName;
ShortName = name.ShortName;

int SurnameLength = FullName.IndexOf(' ');
int FirstnameLength = FullName.Substring(SurnameLength + 1).IndexOf(' ');


Surname = FullName.Substring(0, SurnameLength + 1);
FirstName = FullName.Substring(SurnameLength + 1, FirstnameLength);
Patronymic = FullName.Substring(FirstnameLength + 1);
}

public Name(string surname, string firstname, string patronymic)
{
Surname = surname;
FirstName = firstname;
Patronymic = patronymic;
FullName = surname + ' ' + firstname + ' ' + patronymic;
ShortName = surname + ' ' + firstname[0] + ". " + patronymic[0] + '.';
}



}
}
}
50 changes: 25 additions & 25 deletions Implementation/HR/AbstractPerson.cs
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
namespace Practice.HR
using Practice.HR.Events;
using Practice.Common;
using System;

namespace Practice.HR
{
/// <summary>
/// Абстрактная база для описания конкретных реализаций типа "Человек".
/// Используется для дальнейшего наследования.
/// </summary>
internal abstract class AbstractPerson
internal abstract class AbstractPerson : IPerson
{
internal Organization.Department Department
{
get
{
throw new System.NotImplementedException();
}

set
{
throw new System.NotImplementedException();
}
}
/*
* TODO #3: Реализуйте интерфейс IPerson для класса AbstractPerson
*/

internal Common.Name Name
{
get
{
throw new System.NotImplementedException();
}
private Name name;

public IName Name
{
get { return name; }
set
{
throw new System.NotImplementedException();
ValueChangeEventArgs<IName> args = new ValueChangeEventArgs<IName>(name);

name = new Name(value);

if (NameChange != null)
{
NameChange(this, args);
}
}
}

/*
* TODO #3: Реализуйте интерфейс IPerson для класса AbstractPerson
*/

public event EventHandler<ValueChangeEventArgs<IName>> NameChange;

}
}
}
93 changes: 90 additions & 3 deletions Implementation/HR/Builders.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
using Practice.HR.Events;
using Practice.Common;
using Practice.Organization;
using System;

namespace Practice.HR
Expand All @@ -19,7 +22,43 @@ public static IClientBuilder ClientBuilder()
/*
* TODO #6: Реализовать фабричный метод ClientBuilder класса Builders
*/
throw new NotImplementedException();
return new ClientBuilderClass();
}

private class ClientBuilderClass : IClientBuilder
{
private IClient client = new Client();

public IClient Build()
{
return client;
}

public IClientBuilder Name(IName name)
{
client.Name = new Name(name);
client.NameChange += onNameChange;
return this;
}

public IClientBuilder Name(string name, string surname, string patronymic)
{
client.Name = new Name(name, surname, patronymic);
client.NameChange += onNameChange;
return this;
}

public IClientBuilder Discount(float discount)
{
client.Discount = discount;
return this;
}

private void onNameChange(object sender, ValueChangeEventArgs<IName> args)
{
Console.WriteLine("Клиент {0} изменил имя на {1}", args.OldValue.FullName, client.Name.FullName);
}

}

/// <summary>
Expand All @@ -33,8 +72,56 @@ public static IEmployeeBuilder EmployeeBuilder()
/*
* TODO #7: Реализовать фабричный метод EmployeeBuilder класса Builders
*/
throw new NotImplementedException();
return new EmployeeBuilderClass();
}

private class EmployeeBuilderClass : IEmployeeBuilder
{
private IEmployee employee = new Employee();

public IEmployee Build()
{
return employee;
}

public IEmployeeBuilder Name(IName name)
{
employee.Name = new Name(name);
employee.NameChange += onNameChange;
return this;
}

public IEmployeeBuilder Name(string surname, string firstname, string patronymic)
{
employee.Name = new Name(surname, firstname, patronymic);
employee.NameChange += onNameChange;
return this;
}

public IEmployeeBuilder Department(IDepartment department)
{
employee.Department = new Department(department);
return this;
}

public IEmployeeBuilder Department(string department)
{
employee.Department = new Department(department);
employee.DepartmentChange += onDepartmentChange;
return this;
}

private void onNameChange(object sender, ValueChangeEventArgs<IName> args)
{
Console.WriteLine("Сотрудник {0} изменил имя на {1}", args.OldValue.FullName, employee.Name.FullName);
}

private void onDepartmentChange(object sender, ValueChangeEventArgs<IDepartment> args)
{
Console.WriteLine("Сотрудник {0} был переведен из отдела '{1}' в отдел '{2}'", employee.Name.ShortName, args.OldValue.Name, employee.Department.Name);
}

}

}
}
}
7 changes: 5 additions & 2 deletions Implementation/HR/Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
/// <summary>
/// Скрытая реализация представления о клиенте.
/// </summary>
internal class Client : AbstractPerson
internal class Client : AbstractPerson, IClient
{
/*
* TODO #4: Реализуйте интерфейс IClient для класса Client
*/

public float Discount { get; set; }

}
}
}
30 changes: 27 additions & 3 deletions Implementation/HR/Employee.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,36 @@
namespace Practice.HR
using Practice.HR.Events;
using Practice.Organization;
using System;

namespace Practice.HR
{
/// <summary>
/// Скрытая реализация представления о сотруднике.
/// </summary>
internal class Employee : AbstractPerson
internal class Employee : AbstractPerson, IEmployee
{
/*
* TODO #5: Реализуйте интерфейс IEmployee для класса Employee
*/

private Department department;

public IDepartment Department
{
get { return department; }
set
{
ValueChangeEventArgs<IDepartment> args = new ValueChangeEventArgs<IDepartment>(Department);

department = new Department(value);

if (DepartmentChange != null)
{
DepartmentChange(this, args);
}
}
}

public event EventHandler<ValueChangeEventArgs<IDepartment>> DepartmentChange;
}
}
}
15 changes: 13 additions & 2 deletions Implementation/Organization/Department.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,21 @@
/// <summary>
/// Скрытая реализация представления об отделе предприятия.
/// </summary>
internal struct Department
public struct Department : IDepartment
{
/*
* TODO #2: Реализуйте интерфейс IDepartment для структуры Department
*/
public string Name { get; }
public Department(IDepartment department)
{
Name = department.Name;
}

public Department(string name)
{
Name = name;
}

}
}
}
10 changes: 8 additions & 2 deletions Practice/Program.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using Practice.HR;
using Practice.Common;
using Practice.HR;
using Practice.Organization;
using System;

namespace Practice
{
Expand All @@ -18,7 +21,6 @@ static void Main(string[] args)
.Name("Иванов", "Иван", "Иванович")
.Discount(.1f)
.Build();

IEmployee employee = Builders.EmployeeBuilder()
.Name("Сидоров", "Григорий", "Петрович")
.Department("Бухгалтерия")
Expand All @@ -31,6 +33,10 @@ static void Main(string[] args)
/*
* TODO #9: При помощи отладчика проверить типы и структуру объектов, адресованных переменными client и employee.
*/

client.Name = new Name("Андреев", "Андрей", "Андреевич");
employee.Name = new Name("Кузнецов", "Петр", "Игоревич");
employee.Department = new Department("HR");
}
}
}