From 6e75926f7970e0e4d07e6a637e8a1fb9e6d21050 Mon Sep 17 00:00:00 2001 From: fiatcode Date: Tue, 10 Feb 2026 09:38:58 +0700 Subject: [PATCH] REFACTOR: split validation into value object --- lib/roman_numerals.dart | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/roman_numerals.dart b/lib/roman_numerals.dart index 0490bcb..1309230 100644 --- a/lib/roman_numerals.dart +++ b/lib/roman_numerals.dart @@ -1,4 +1,21 @@ +class RomanNumeralInput { + static const _minValue = 1; + static const _maxValue = 3999; + + final int value; + + RomanNumeralInput(this.value) { + if (value < _minValue || value > _maxValue) { + throw ArgumentError( + 'Roman numeral input must be between $_minValue and $_maxValue', + ); + } + } +} + String integerToRoman(int number) { + final input = RomanNumeralInput(number); + const conversionRules = [ (1000, 'M'), (900, 'CM'), @@ -15,12 +32,8 @@ String integerToRoman(int number) { (1, 'I'), ]; - if (number <= 0 || number > 3999) { - throw ArgumentError('Number must be between 1 and 3999'); - } - final result = StringBuffer(); - var remaining = number; + var remaining = input.value; for (final (value, symbol) in conversionRules) { while (remaining >= value) {