Skip to content

Commit 7f3853c

Browse files
committed
Добавлены алиасы и безопасные методы для IirBuilder
В IirSpecificationBuilder реализованы методы-алиасы BuildSpecification, TryGetSpecification, BuildFilter и CreateMany для удобного и безопасного получения спецификаций и экземпляров фильтра. В тестах добавлены проверки новых методов, включая сценарии с некорректной спецификацией. Улучшено удобство API и расширено тестовое покрытие.
1 parent 556da7c commit 7f3853c

2 files changed

Lines changed: 114 additions & 0 deletions

File tree

MathCore.DSP/Filters/Builders/IirBuilder.cs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,36 @@ public bool TryCreate(out Filter? Filter)
198198
/// <summary>Выполнить неявное преобразование в фильтр</summary>
199199
/// <param name="Builder">Построитель фильтра</param>
200200
public static implicit operator Filter(IirSpecificationBuilder Builder) => Builder.Create();
201+
202+
/// <summary>Сформировать объект спецификации фильтра</summary>
203+
/// <returns>Спецификация фильтра</returns>
204+
public IirFilterSpecification BuildSpecification() => GetSpecification();
205+
206+
/// <summary>Попытаться сформировать объект спецификации фильтра без выброса исключения наружу</summary>
207+
/// <param name="Specification">Сформированная спецификация фильтра или null</param>
208+
/// <returns>True, если спецификация успешно сформирована</returns>
209+
public bool TryGetSpecification(out IirFilterSpecification? Specification)
210+
{
211+
try
212+
{
213+
Specification = GetSpecification();
214+
return true;
215+
}
216+
catch (ArgumentException)
217+
{
218+
Specification = null;
219+
return false;
220+
}
221+
catch (InvalidOperationException)
222+
{
223+
Specification = null;
224+
return false;
225+
}
226+
}
227+
228+
/// <summary>Сформировать экземпляр фильтра</summary>
229+
/// <returns>Экземпляр IIR-фильтра</returns>
230+
public Filter BuildFilter() => Create();
201231
}
202232

203233
/// <summary>Построитель IIR-фильтров выбранного семейства</summary>
@@ -454,9 +484,52 @@ static double Require(double? Value, string Name)
454484
/// <returns>Спецификация фильтра</returns>
455485
public IirFilterSpecification GetSpecification() => ToSpecification().GetSpecification();
456486

487+
/// <summary>Сформировать объект спецификации фильтра</summary>
488+
/// <returns>Спецификация фильтра</returns>
489+
public IirFilterSpecification BuildSpecification() => GetSpecification();
490+
491+
/// <summary>Попытаться сформировать объект спецификации фильтра без выброса исключения наружу</summary>
492+
/// <param name="Specification">Сформированная спецификация фильтра или null</param>
493+
/// <returns>True, если спецификация успешно сформирована</returns>
494+
public bool TryGetSpecification(out IirFilterSpecification? Specification)
495+
{
496+
try
497+
{
498+
Specification = GetSpecification();
499+
return true;
500+
}
501+
catch (ArgumentException)
502+
{
503+
Specification = null;
504+
return false;
505+
}
506+
catch (InvalidOperationException)
507+
{
508+
Specification = null;
509+
return false;
510+
}
511+
}
512+
457513
/// <summary>Создать фильтр на основе DSL-спецификации</summary>
458514
/// <returns>Экземпляр IIR-фильтра</returns>
459515
public Filter Create() => GetSpecification().CreateFilter();
516+
517+
/// <summary>Сформировать экземпляр фильтра</summary>
518+
/// <returns>Экземпляр IIR-фильтра</returns>
519+
public Filter BuildFilter() => Create();
520+
521+
/// <summary>Создать несколько независимых экземпляров фильтра</summary>
522+
/// <param name="Count">Количество экземпляров</param>
523+
/// <returns>Перечисление экземпляров фильтра</returns>
524+
/// <exception cref="ArgumentOutOfRangeException">Количество экземпляров меньше единицы</exception>
525+
public IEnumerable<Filter> CreateMany(int Count)
526+
{
527+
if (Count < 1)
528+
throw new ArgumentOutOfRangeException(nameof(Count), Count, "Количество экземпляров должно быть больше нуля");
529+
530+
for (var i = 0; i < Count; i++)
531+
yield return Create();
532+
}
460533
}
461534

462535
/// <summary>Построитель RC-фильтров</summary>

Tests/MathCore.DSP.Tests/Filters/IirFluentBuilderTests.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,4 +218,45 @@ public void RcBuilderReturnsSpecificationAndBuildsFilter()
218218
Assert.IsInstanceOfType(specification, typeof(RcHighPassSpecification));
219219
Assert.IsInstanceOfType(filter, typeof(RCHighPass));
220220
}
221+
222+
[TestMethod]
223+
public void BuildSpecificationAliasReturnsSpecification()
224+
{
225+
const double dt = 1d / 5_000;
226+
227+
var specification = Filter.IIR(dt)
228+
.Butterworth
229+
.LowPass(500, 1_500)
230+
.BuildSpecification();
231+
232+
Assert.IsInstanceOfType(specification, typeof(ButterworthLowPassSpecification));
233+
}
234+
235+
[TestMethod]
236+
public void BuildFilterAliasReturnsFilter()
237+
{
238+
var filter = Filter.IIR()
239+
.WithSamplingFrequency(10_000)
240+
.Elliptic
241+
.BandPass()
242+
.WithPassband(1_000, 2_000)
243+
.WithStopband(500, 2_500)
244+
.BuildFilter();
245+
246+
Assert.IsInstanceOfType(filter, typeof(global::MathCore.DSP.Filters.EllipticBandPass));
247+
}
248+
249+
[TestMethod]
250+
public void TryGetSpecificationReturnsFalseForIncompleteDsl()
251+
{
252+
var success = Filter.IIR()
253+
.WithSamplingFrequency(10_000)
254+
.Butterworth
255+
.LowPass()
256+
.WithPassband(1_000)
257+
.TryGetSpecification(out var specification);
258+
259+
Assert.IsFalse(success);
260+
Assert.IsNull(specification);
261+
}
221262
}

0 commit comments

Comments
 (0)