Tornando seu Código mais Claro com a Simplicidade do TryGet Pattern
Com a simplicidade do TryGet Pattern, torna um código mais claro e que garante que ao menos um atributo de qualidade seja alcançado, o atributo testability. Além disso, tem a garantia que eventuais exceptions sejam lançadas por descuidos de desenvolvedores que se esquecem de fazer defensivas de código.
Talvez, você possa se perguntar. Com o Resharper não seria mais fácil? Sim, seria. Entretanto, embora o Resharper seja muito bom, ele torna o programador preguiçoso.
Com um pouco mais de clareza, trouxe, por exemplo, um método de consultar cliente pelo nome.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class Program { public static void Main(string[] args) { var name = Console.ReadLine(); var customer = FindCustomerByName(name); Console.WriteLine($"Selected customer: {customer.Name}"); Console.ReadKey(); } public static Customer FindCustomerByName(string name) { var customers = new List<Customer>(5) { new() {Name = "Tiago"}, new () {Name = "Flavia"}, new () { Name = "Arthur"}, new () {Name = "Ludmila"}, new () {Name = "Sophia"}, new () {Name = "Tina"} }; var result = customers .FirstOrDefault(_ => _.Name.Equals(name)); return result; } } |
Propositalmente, ignorei a defensiva validando se o cliente é nulo, diga-se de passagem, algo muito comum. Na prática, o que acontece é que esse código tem um grande potencial para gerar um NullReferenceException.
Utilizando o padrão TryGet, o erro de NullReferenceException não aconteceria.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
{ public static void Main(string[] args) { var name = Console.ReadLine(); Console.WriteLine(TryGetCustomerByName(name, out var customer) ? $"Selected customer: {customer.Name}" : $"Customer {name} not found."); Console.ReadKey(); } public static bool TryGetCustomerByName(string name, out Customer customer) { var customers = new List<Customer>(5) { new() {Name = "Tiago"}, new () {Name = "Flavia"}, new () { Name = "Arthur"}, new () {Name = "Ludmila"}, new () {Name = "Sophia"}, new () {Name = "Tina"} }; customer = customers .FirstOrDefault(_ => _.Name.Equals(name)); return customer is not null; } } |
É notório a clareza ao utilizar um código com o padrão TryGet. Para saber, nativamente o padrão é utilizado na struct Int32.
1 2 3 4 5 6 7 8 9 10 |
public static bool TryParse([NotNullWhen(true)] string? s, out int result) { if (s == null) { result = 0; return false; } return Number.TryParseInt32IntegerStyle(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result) == Number.ParsingStatus.OK; } |
Algo simples que nos faz repensar a forma como escrevemos nossos códigos. Embora a simplicidade TryGet Patern traga uma boa leitura de código, não há impactos em performance, nem para melhor nem para pior.