є таке завдання:
Case
A job of 1000 images is going to be edited by a crew of 3 people:
· P1: 1 image per 2 minutes
· P2: 1 image per 3 minutes
· P3: 1 image per 4 minutes
How long will this job take in total?
How many images will be edited by every person?
Scoring:
• Correct answer and explain the necessary steps
• Working code
• It should work for any situation (amount of images, amount of people, individual speed)
Please focus on:
OOP implementation;
N-tier architecture implementation;
Unit testing implementation;
General programing rules and standards usage.
Розв'язок:
Завдання дали на співбесіді.
Підкажіть будь-ласка як його правильно оформити для взаємодії з користувачем, що переробити, можливо щось додати,щось поміняти?
namespace ImageMontageWorkers
{
public class Image
{
public int Id { get; }
public string Title { get; }
public Image(int id, string title)
{
Id = id;
Title = title;
}
}
}
using System;
using System.Collections.Generic;
namespace ImageMontageWorkers
{
/// <summary>створення класу Працівник.</summary>
public class Worker
{
/// <summary>ім'я працівника.</summary>
public string Name { get; }
/// <summary>Вертає фото, яке обробляє працівник.
/// Если <see langword="null"/>,Це значить, що у працівника був простій . </summary>
public Image CurrentImage { get; private set; }
/// <summary>делегування методу для отримання працівником фото для обробки</summary>
private readonly List<Image> getCurrentImage;
/// <summary>Необхідний час для обробки.</summary>
public int ProcessTime { get; }
/// <summary>Час витрачений на обробку поточної картинки.</summary>
public int ProcessingTime { get; private set; }
// Список картинок оброблених працівником.
private readonly List<Image> processedImages = new List<Image>();
/// <summary>Іммутабельний список фото, оброблених працівником.</summary>
public IReadOnlyList<Image> ProcessedImages;
public Worker(string name, Func<Image> getCurrentImage, int processTime)
{
Name = name;
this.getCurrentImage = getCurrentImage;
ProcessTime = processTime;
ProcessedImages = processedImages.AsReadOnly();
}
/// <summary>періоди часу, коли працівник працював</summary>
public int CountWorkingInterval { get; private set; }
/// <summary>Метод для виконання наступного інтервалу.</summary>
public void NextWorkingInterval()
{
if (CurrentImage != null)
{
ProcessingTime--;
CountWorkingInterval++;
}
if (ProcessingTime == 0)
{
if (CurrentImage != null)
processedImages.Add(CurrentImage);
CurrentImage = getCurrentImage();
if (CurrentImage != null)
ProcessingTime = ProcessTime;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
namespace ImageMontageWorkers
{
public class Brigade
{
private readonly Queue<Image> images = new Queue<Image>();
private readonly List<Worker> workers = new List<Worker>();
private Image GetNextImage()
{
if (images.Count == 0)
return null;
return images.Dequeue();
}
public Brigade()
{
for (int i = 0; i < 1000; i++)
{
images.Enqueue(new Image(i, $"картинка №{i + 1}"));
}
workers.Add(new Worker("Перший", GetNextImage, 2));
workers.Add(new Worker("Другий", GetNextImage, 3));
workers.Add(new Worker("Третій", GetNextImage, 4));
}
public bool NextWorkingInterval()
{
workers.ForEach(w => w.NextWorkingInterval());
return images.Count != 0 ||
workers.Any(w => w.CurrentImage != null);
}
public void WorkStart()
{
while (NextWorkingInterval())
{
Console.WriteLine($"Картинок в черзі: {images.Count}");
}
foreach (var worker in workers)
{
Console.WriteLine($"{worker.Name}: {worker.CountWorkingInterval} - {worker.ProcessedImages.Count}");
}
}
}
}
static void Main(string[] args)
{
Brigade brigade = new Brigade();
brigade.WorkStart();