Konwencja nazewnicza walidatorów

0

Cześć.

W myśl zasady SOLID postanowiłem stworzyć klasy do walidacji maila i telefonów. Tylko do końca nie jestem pewien jak je nazywać i jaka jest konwencja nazywania tego typu klas. Pytanie może dość banalne(jestem pre-juniorem) ale dla mnie ważne .

Mam stworzoną klasę EmailValidation i nie wiem czy jest to nazwa odpowiednia . Nazstanawiałem sie nad tym lub nad EmailValidator.

public static class EmailValidation
    {
        const string EMAIL_REGEX = @"^[\w\.]+(@)[\w\-\.]{1,256}(\.)([\w\.]{1,256}?)([A-z0-9]{1,3})";

        public static bool IsValidEmail(string emailAddress)
        {
            return Regex.IsMatch(emailAddress, EMAIL_REGEX);
        }
    }
1

FluentValidation stostuje/promuje SomethingValidator

0

@WeiXiao: Dzieki, przyda sie. Od razu widzę, że mogę potworzyć klasy statyczne do walidacji wszystkich obiektów które chcę wrzucić do bazy.

0

Btw. ten regex jest niepoprawny.

Wywala się przy dość trywialnym przypadku typu: [email protected]

https://emailregex.com/

Chociaż ten regex z tego co widzę też nie jest idealny, bo mail typu asd@asd nie przechodzi, ale raczej taki usecase dla ciebie nie jest istotny.

0

@WeiXiao: a czy uzycie klasy System.Net.Mail.MailAddress jest dobrym wyborem ?

public bool IsEmailValid(string emailaddress)
{
    try
    {
        MailAddress m = new MailAddress(emailaddress);
        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}
1

Porównałem te dwie metody na emailach z: https://en.wikipedia.org/wiki/Email_address#Examples

using System;
using System.Net.Mail;
using System.Linq;
using System.Text.RegularExpressions;

public class Program
{
	const string EMAIL_REGEX = @"^[\w\.]+(@)[\w\-\.]{1,256}(\.)([\w\.]{1,256}?)([A-z0-9]{1,3})";

	public static bool B(string emailAddress)
	{
		return Regex.IsMatch(emailAddress, EMAIL_REGEX);
	}

	public static bool A(string emailaddress)
	{
		try
		{
			MailAddress m = new MailAddress(emailaddress);
			return true;
		}
		catch (FormatException)
		{
			return false;
		}
	}

	public static void Main()
	{
        var validEmails = new[] 
        {
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "admin@mailserver1",
            "[email protected]",
            "\" \"@example.org",
            "\"john..doe\"@example.org"
        };

        var invalidEmails = new string[] 
        {
            "Abc.example.com",
            "A@b@[email protected]",
            "a\"b(c)d,e:f;g<h>i[j\\k][email protected]",
            "just\"not\"[email protected]",
            "this is\"not\\[email protected]",
            "this\\ still\\\"not\\\\[email protected]",
            "1234567890123456789012345678901234567890123456789012345678901234+x@example.com"
        };


		Console.WriteLine(validEmails.All(x => A(x))); // true
		Console.WriteLine(validEmails.All(x => B(x))); // false
		
		Console.WriteLine(invalidEmails.All(x => !A(x))); // false
		Console.WriteLine(invalidEmails.All(x => !B(x))); // true
	}
}

Jeżeli chodzi o poprawne adresy, to metoda A łapie je wszystkie dobrze, ale przy sprawdzaniu listy niepoprawnych jest jeden wyjątek

Adres 1234567890123456789012345678901234567890123456789012345678901234+x@example.com jest według metody A poprawny, chociaż początek nie powinien przekraczać 64 znaków.

Raczej używałbym A

edit. poprawiłem escapy.

0

Skoro tak chcesz sam regexy pisać, to tu jest prosty diagram:

title

A tak bardziej poważnie, to zamiast wynajdować koło na nowo, lepiej użyć FluentValidation.

1

Pod względem wydajności FluentValidation to szczyt zamularstwa.

0

Jak to zmierzyłeś i jak bardzo wpływa to na szybkość działania całego systemu?

0

A Przepraszam patrzyłem w bebechy od FluentValidation i sam siebie wprowadziłem w błąd, teraz dopiero rozumiem jak to działa myślałem, że to pobiera wartości i nazwy po prostu kompilując standardowo Expression, a to idzie przez ConstantExpression, a więc nie da się tego technicznie (przez lambde) zrobić szybciej.

0

Przepraszam, ale co mają wspólnego zasady SOLID do klasy którą przedstawiłeś? Co masz na myśli?

1 użytkowników online, w tym zalogowanych: 0, gości: 1