输入数据验证器(良好实践)

Input Data Validator (good practice)

我在一个从用户接收数据的应用程序中工作,我尝试为它编写一个验证器函数,但我不确定这是否是正确的处理方法。

示例:用户将输入一个数字(作为字符串,不要问我为什么不使用 int,让它成为一个字符串),比方说“103”,我将使用这个数字在函数内部,但首先,在该函数的开头,我调用了一个验证函数:

private bool ValidateCommandCode(string code)
{
    bool isValid = false;

    byte commandByte = new byte();

    if (byte.TryParse(code, out commandByte))
    {
        isValid = true;
    }
    else
    {
        Log.Error($"Command number {CommandCode} for the request is not valid!");
        isValid = false;
    }

    return isValid;
}

private async void MainFunction()
{
    if (ValidateCommandCode(CommandCode) == false)
        return;

    // ... do the magic with the CommandCode ...

}

以同样的方式,我想验证用户填写的另一个字段: 例如数据:000A000B

private bool ValidateRequestData(string data)
        {
            bool isValid = false;
            
            if (!String.IsNullOrEmpty(Payload) && !String.IsNullOrWhiteSpace(Payload))
            {
                if (Payload.Trim().Replace(" ", "").Length % 2 != 0)
                {
                    Log.Error($"Payload (Data) {Payload} for the request doesn't have an even number of bytes!");
                    isValid = false;

                }
                else
                {
                    isValid = true;
                }
            }
            else
            {
                isValid = true;
            }

            return isValid;
        }

这是继续进行的好方法吗?这么多标志“isValid”是不是太混乱了?

我会创建一个单独的 class 用于验证,并通过将记录器传递给验证器来分离日志记录。

    public interface ILogger
    {
        void Error(string message);
    }
    public class Logger : ILogger
    {
        public void Error(string message) { }
    }

    public class LoggingValidator
    {
        private readonly ILogger _logger;
        // Payload looks like a hex number, so we check this.
        private static readonly Regex _payloadExp = new Regex(@"^\s*([0-9A-F]{2} *)+\s*$", RegexOptions.Compiled);
        public LoggingValidator(ILogger logger)
        {
            _logger = logger;
        }


        public bool CheckCommand(string value)
        {
            if (byte.TryParse(value, out _))  // Discard operator _
                return true;
            _logger.Error("Your message.");
            return false;
        }

        public bool CheckPayload(string value)
        {
            if (_payloadExp.IsMatch(value ?? ""))
                return true;
            _logger.Error("Your message.");
            return false;
        }
    }

    public class Program
    {
        private static void Main(string[] args)
        {
            var validator = new LoggingValidator(new Logger());
            string value = "123";
            if (validator.CheckCommand(value)) { /* ... */ }
            if (validator.CheckPayload(value)) { /* ... */ }
        }
    }