Skip to content

Commit d24f2f3

Browse files
committed
Часть логики светофора вынесена в реализацию интерфейса
1 parent b3f4247 commit d24f2f3

20 files changed

+149
-19
lines changed
Binary file not shown.
Binary file not shown.
Binary file not shown.
14.5 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace TrafficLights.Enums
8+
{
9+
/// <summary>
10+
/// Перечисление цветов огней
11+
/// </summary>
12+
public enum LightEnum
13+
{
14+
Red,
15+
16+
Yellow,
17+
18+
Green
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using TrafficLights.Enums;
3+
using TrafficLights.Interfaces;
4+
using TrafficLights.Models;
5+
6+
namespace TrafficLights.Implementations
7+
{
8+
public class TrafficLights : ITrafficLights
9+
{
10+
private TrafficLightsModel _model;
11+
12+
public void Setup(TrafficLightsModel model)
13+
{
14+
_model = model;
15+
}
16+
17+
public void ChangeLightState(LightEnum light, LightStateEnum state)
18+
{
19+
switch(light)
20+
{
21+
case LightEnum.Red:
22+
_model.RedLightState = state;
23+
break;
24+
25+
case LightEnum.Yellow:
26+
_model.YellowLightState = state;
27+
break;
28+
29+
case LightEnum.Green:
30+
_model.GreenLightState = state;
31+
break;
32+
33+
default:
34+
throw new ArgumentException(nameof(light));
35+
}
36+
}
37+
38+
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using TrafficLights.Enums;
2+
using TrafficLights.Models;
3+
4+
namespace TrafficLights.Interfaces
5+
{
6+
/// <summary>
7+
/// Интерфейс для управления светофором
8+
/// </summary>
9+
public interface ITrafficLights
10+
{
11+
/// <summary>
12+
/// Связать реализацию интерфейса с реальным светофором
13+
/// </summary>
14+
void Setup(TrafficLightsModel model);
15+
16+
/// <summary>
17+
/// Изменить состояние огня
18+
/// </summary>
19+
/// <param name="light">С каким огнём работаем</param>
20+
/// <param name="state">В какое состояние его переводим</param>
21+
void ChangeLightState(LightEnum light, LightStateEnum state);
22+
}
23+
}

TrafficLights/TrafficLights/Program.cs

+28-1
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,44 @@
44
using System;
55
using ReactiveUI;
66
using Avalonia.ReactiveUI;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using Avalonia.Logging;
9+
using Splat;
10+
using System.IO;
11+
using TrafficLights.Interfaces;
712

813
namespace TrafficLights
914
{
1015
internal class Program
1116
{
17+
/// <summary>
18+
/// Èíæåêòîð çàâèñèìîñòåé
19+
/// </summary>
20+
public static ServiceProvider Di { get; set; }
21+
1222
// Initialization code. Don't use any Avalonia, third-party APIs or any
1323
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
1424
// yet and stuff might break.
1525
[STAThread]
16-
public static void Main(string[] args) => BuildAvaloniaApp()
26+
public static void Main(string[] args)
27+
{
28+
// Íàñòðîéêà èíæåêòîðà çàâèñèìîñòåé
29+
Di = ConfigureServices()
30+
.BuildServiceProvider();
31+
32+
BuildAvaloniaApp()
1733
.StartWithClassicDesktopLifetime(args);
34+
}
35+
36+
// Setting up DI
37+
public static IServiceCollection ConfigureServices()
38+
{
39+
IServiceCollection services = new ServiceCollection();
40+
41+
services.AddSingleton<ITrafficLights, Implementations.TrafficLights>();
42+
43+
return services;
44+
}
1845

1946
// Avalonia configuration, don't remove; also used by visual designer.
2047
public static AppBuilder BuildAvaloniaApp()

TrafficLights/TrafficLights/TrafficLights.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
3030
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="0.10.18" />
3131
<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.18" />
32+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
3233
<PackageReference Include="XamlNameReferenceGenerator" Version="1.3.4" />
3334
</ItemGroup>
3435
</Project>

TrafficLights/TrafficLights/ViewModels/MainWindowViewModel.cs

+31-18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using Avalonia.Media;
2+
using Microsoft.Extensions.DependencyInjection;
23
using ReactiveUI;
4+
using Splat;
35
using System;
46
using System.Collections.Generic;
57
using System.Linq;
@@ -9,6 +11,7 @@
911
using System.Threading.Tasks;
1012
using System.Timers;
1113
using TrafficLights.Enums;
14+
using TrafficLights.Interfaces;
1215
using TrafficLights.Models;
1316

1417
namespace TrafficLights.ViewModels
@@ -121,12 +124,22 @@ public string ConsoleText
121124
/// </summary>
122125
private System.Timers.Timer _automatTimer;
123126

127+
/// <summary>
128+
/// Интерфейс для управления огнями реального светофора
129+
/// </summary>
130+
private readonly ITrafficLights _trafficLights;
131+
124132
/// <summary>
125133
/// Конструктор
126134
/// </summary>
127135
public MainWindowViewModel(TrafficLightsModel trafficLightsModel)
128136
{
129137
_model = trafficLightsModel;
138+
139+
// Запоминаем конкретный светофор
140+
_trafficLights = Program.Di.GetService<ITrafficLights>();
141+
_trafficLights.Setup(_model);
142+
130143

131144
PressRedCommand = ReactiveCommand.Create(OnRedPressed); // Связывание метода с командой
132145
PressYellowCommand = ReactiveCommand.Create(OnYellowPressed);
@@ -213,9 +226,9 @@ private void OnCheckPressed()
213226
/// </summary>
214227
private void OnBlinkPressed()
215228
{
216-
_model.RedLightState = LightStateEnum.Blinking;
217-
_model.YellowLightState = LightStateEnum.Blinking;
218-
_model.GreenLightState = LightStateEnum.Blinking;
229+
_trafficLights.ChangeLightState(LightEnum.Red, LightStateEnum.Blinking);
230+
_trafficLights.ChangeLightState(LightEnum.Yellow, LightStateEnum.Blinking);
231+
_trafficLights.ChangeLightState(LightEnum.Green, LightStateEnum.Blinking);
219232
}
220233

221234
/// <summary>
@@ -319,9 +332,9 @@ private void OnAutomatStep(Object source, ElapsedEventArgs e)
319332

320333
_model.CurrentState = TrafficLightState.BlinkingGreen;
321334

322-
_model.GreenLightState = LightStateEnum.Blinking;
323-
_model.YellowLightState = LightStateEnum.Off;
324-
_model.RedLightState = LightStateEnum.Off;
335+
_trafficLights.ChangeLightState(LightEnum.Green, LightStateEnum.Blinking);
336+
_trafficLights.ChangeLightState(LightEnum.Yellow, LightStateEnum.Off);
337+
_trafficLights.ChangeLightState(LightEnum.Red, LightStateEnum.Off);
325338

326339
SetTimerInterval(TrafficLightsModel.BlinkingGreenDuration);
327340
break;
@@ -331,9 +344,9 @@ private void OnAutomatStep(Object source, ElapsedEventArgs e)
331344

332345
_model.CurrentState = TrafficLightState.Yellow;
333346

334-
_model.GreenLightState = LightStateEnum.Off;
335-
_model.YellowLightState = LightStateEnum.On;
336-
_model.RedLightState = LightStateEnum.Off;
347+
_trafficLights.ChangeLightState(LightEnum.Green, LightStateEnum.Off);
348+
_trafficLights.ChangeLightState(LightEnum.Yellow, LightStateEnum.On);
349+
_trafficLights.ChangeLightState(LightEnum.Red, LightStateEnum.Off);
337350

338351
SetTimerInterval(TrafficLightsModel.YellowDuration);
339352
break;
@@ -343,9 +356,9 @@ private void OnAutomatStep(Object source, ElapsedEventArgs e)
343356

344357
_model.CurrentState = TrafficLightState.Red;
345358

346-
_model.GreenLightState = LightStateEnum.Off;
347-
_model.YellowLightState = LightStateEnum.Off;
348-
_model.RedLightState = LightStateEnum.On;
359+
_trafficLights.ChangeLightState(LightEnum.Green, LightStateEnum.Off);
360+
_trafficLights.ChangeLightState(LightEnum.Yellow, LightStateEnum.Off);
361+
_trafficLights.ChangeLightState(LightEnum.Red, LightStateEnum.On);
349362

350363
SetTimerInterval(TrafficLightsModel.RedDuration);
351364
break;
@@ -355,9 +368,9 @@ private void OnAutomatStep(Object source, ElapsedEventArgs e)
355368

356369
_model.CurrentState = TrafficLightState.RedAndYellow;
357370

358-
_model.GreenLightState = LightStateEnum.Off;
359-
_model.YellowLightState = LightStateEnum.On;
360-
_model.RedLightState = LightStateEnum.On;
371+
_trafficLights.ChangeLightState(LightEnum.Green, LightStateEnum.Off);
372+
_trafficLights.ChangeLightState(LightEnum.Yellow, LightStateEnum.On);
373+
_trafficLights.ChangeLightState(LightEnum.Red, LightStateEnum.On);
361374

362375
SetTimerInterval(TrafficLightsModel.RedAndYellowDuration);
363376
break;
@@ -367,9 +380,9 @@ private void OnAutomatStep(Object source, ElapsedEventArgs e)
367380

368381
_model.CurrentState = TrafficLightState.Green;
369382

370-
_model.GreenLightState = LightStateEnum.On;
371-
_model.YellowLightState = LightStateEnum.Off;
372-
_model.RedLightState = LightStateEnum.Off;
383+
_trafficLights.ChangeLightState(LightEnum.Green, LightStateEnum.On);
384+
_trafficLights.ChangeLightState(LightEnum.Yellow, LightStateEnum.Off);
385+
_trafficLights.ChangeLightState(LightEnum.Red, LightStateEnum.Off);
373386

374387
SetTimerInterval(TrafficLightsModel.GreenDuration);
375388
break;

Описание автомата.txt

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
1. Проверка, каким светом горит светофор.
2+
2. Гашение одной лампы и включение другой через энумку состояния огня.
3+
3. Остановка таймера.
4+
4. Обращение к константе, где лежит время горения конкретного огня, задание таким образом времени горения модели.
5+
5. Старт таймера.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2022-09-21T12:28:00.006Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.3.0 Chrome/104.0.5112.114 Electron/20.1.3 Safari/537.36" etag="eS4_FSim4-sWDnYLaKgl" version="20.3.0" type="device"><diagram id="bvKWsWnQlB2reWRYtqZQ" name="Страница 1">7Vtbb6s4EP41PO4K25jLYy7trnRU6Uh92NOnFRvcBC0JEZAm6a9fGxswAwk0LZCVKlWRPR6MGX/feGxPDbLYnv5I/P3mKQ5YZGAzOBlkaWCMLIwN8WcGZynxTCoF6yQMlFIleA7fmRKaSnoIA5bWFLM4jrJwXxeu4t2OrbKazE+S+FhXe42j+lv3/po1BM8rP2pK/wqDbCOlLnYq+Z8sXG+KNyPbky1bv1BWX5Ju/CA+aiLyYJBFEseZLG1PCxYJ4xV2kc89XmgtB5awXdbngT368Zq9v/ygfz9Rd7Z/Wj/98n9Ts/PmRwf1wcbSNDwifucPxhIZrpmX3bwsdPOqk//S/HcumjyUl5e52jwvK0Ok2bkwJh8QnzdemR83Ycae9/5KtBw5dLhsk20jXkO8qEbFkoydLn4uKo3I0cfiLcuSM1dRD2Cq7K6Ah4p5OFbTWMo22hS6SuYr5KzLrivj8oKy7wdsTdpt3dOU0u6LYjL4r5wkM1eTU+VprdNa37o761vt1rc1i88Vxu8FwtSpGxFbUxuR3uguZlqTBOy9uQsCbE3sqW1tt9u6pymLJjUB12G+KNSw5mRo0blUziVTzhAi98YGtzlD0ECrQ/LGAmUEtgtmIiTh1VXkp2m4qhspiQ+7INc2c20+xl965UVUfqdFdXnSG5dnVZNjYEEjrgGG5oGUn6xZ1rViNSdEMzhtsXchS1jkZ+FbfRhtk6De8DMO+QAvMhLZYB7T+JCsmHpKD3xARxYGHSHQkbRDoyM+V/5ZU9sLhfTygC0TvIfWAjJekD1WgCttejsGvZEwWMHupYa6wTFoTYlBuALfjEF7JAzaCLzHMa+PCzpVcwTMFmMcCrSnMNMwy2svRT+8XCFWVM4GADoaytlKpHQHqJ2EoPdEiNK3fpYQpbf/akIAgBN3DICjcQCuwbsCewfAgSdH4wGc9gS4PSXAsQcAbt4IcGIB4NFhAA7fY5nXPX4ZDrcToqkPv8Meg0At51KDrxBmTwJNtkLYPQmEpyQQAgQq6x8lEAaeG1nDEOjSgIcFeMth4MArxPUAaAKYTurnEQiUya1+vtwSFBH0QH4eQT8Mj/uhPtiNEnRdH541diwLsPtimbiob7WbaViWtRz6DrKMmB6uxWLI6YjGeOUnS0L+gSzpiNC+bq/dyVz8f1hgGhc7kHC9IzR4XgNdwBcxF0ZQqCtCs1FNvytAA+vXKMtXy0XAvcRnaCLykJ7kmfRQlcKg6tb9OwXbiKGiM4qvobupTnFNveP4iwLudFANqiM0BtdaLoIG4Br6JNNGPEjoe1I26dGxA4Bbbmc+yjQHBnKQsl/ENAcGsh0RnQsjwA7yOPCGlYxBHmdY8rQeCnRRoY1yo+3O+p7CTXrMbIGQid589wc8Nh3q7g+ei3eQwQLrMO2ICeHdYlf/xHXr+qNst1ouxEXKwqOWsvCg5RlQTT5TCQ1YV5tpZZnf4BR5D1JSZpo8GirjAWsKXiOboUibgC4gY6esznM/Ctc74QQ4wcQWbS5yF8KVH81UwzYMAvH4PGFp+O7/k3cluKqgwvulc4MuRV+HLE5lZqPoOs2S+F+2iKNYbP128U708hpGERApY34qZ8KBMJNVPWXCa6ExXKu+LGWiWLu+IXIvEGl4yMkh0nJ59g2RKSFiE6ce6aHJMYK/MXInGLkfTFzIr/7GxFR+gxDaGuQOgRFerf6VQga01T+kkIf/AA==</diagram></mxfile>

0 commit comments

Comments
 (0)