Community

๐Ÿ•Š๏ธ ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ 8๊ฐ€์ง€ ํŒ

ํด๋ฆฐ ์ฝ”๋“œ๋ž€ ์ฝ๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์šฐ๋ฉฐ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ์ˆ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฐ์Šต์œผ๋กœ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด๋ผ๊ณ ๋„ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆฐ ์ฝ”๋”ฉ์„ ์—ฐ์Šตํ•  ๋•Œ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฆฌํŒฉํ† ๋ง์ž…๋‹ˆ๋‹ค. ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•˜์—ฌ ์˜ค๋Š˜ ํ•œ ๋‹จ๊ณ„์”ฉ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€๋ด…์‹œ๋‹ค. ``` public void Process(Order? order) { if(order is null) { if(order.isVerified) { if(order.Items.Count > 0) { if(order.Items.Count > 15) { throw new Exception("The order " + order.Id + " has too many items"); } if(order.Status != "ReadyToProcess") { throw new Exception("The order " + order.Id + " isn't ready to process"); } order.IsProcessed = true; } } } ``` 1๏ธโƒฃ ์กฐ๊ธฐ ๋ฐ˜ํ™˜ ์›์น™ if ๋ฌธ์ด ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ๊ฒƒ์€ ๊ต‰์žฅํžˆ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š” ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์กฐ๊ธฐ ๋ฐ˜ํ™˜ ์›์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ์‹œ๋‹ค. ``` public void Process(Order? order) { if(order is null) { return; } if(!order.isVerified) { return; } if(order.Items.Count ==0) { return; } if(order.Items.Count > 15) { throw new Exception("The order " + order.Id + " has too many items"); } if(order.Status != "ReadyToProcess") { throw new Exception("The order " + order.Id + " isn't ready to process"); } order.IsProcessed=true; } ``` 2๏ธโƒฃ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ฌธ์žฅ ๋ณ‘ํ•ฉ ๋งŒ์•ฝ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๋‹ค๋ฉด, ๋ฌธ์žฅ์„ ๋ณ‘ํ•ฉ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•๋„ ๊ณ ๋ คํ•ด ๋ด…์‹œ๋‹ค. ``` public void Process(Order? order) { if(order is null | !order.isVerified | order.Items.Count == 0) { return; } order.IsProcessed=true; } ``` 3๏ธโƒฃ ๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด LINQ ์‚ฌ์šฉ LINQ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ํ‘œํ˜„์ ์œผ๋กœ ๋งŒ๋“ญ์‹œ๋‹ค. Items.Count == 0์œผ๋กœ ์ฒดํฌํ•˜๋Š” ๋Œ€์‹ , ์ €๋Š” Any ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. LINQ์˜ ์„ฑ๋Šฅ์ด ๋” ๋‚˜์˜๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ €๋Š” ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๋” ํฐ ๋น„์šฉ์„ ์†Œ๋ชจํ•˜๋Š” ์ž‘์—…์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์–ด๋”˜๊ฐ€์— ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ``` public void Process(Order? order) { if(order is null || !order.IsVerified || !order.Items.Any()) { return; } if(order.Items.Count > 15) { throw new Exception("The order " + order.Id + " has too many items"); } if(order.Status != "ReadyToProcess") { throw new Exception("The order " + order.Id + " isn't ready to process"); } order.IsProcessed = true; } ``` 4๏ธโƒฃ ๋ถ€์šธ ์‹์„ ๋ฉ”์†Œ๋“œ๋กœ ๋Œ€์ฒด if๋ฌธ์—์„œ ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ๊ฐ€๋…์„ฑ์„ ์ €ํ•˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` public void Process(Order? order) { if(!Processable(order)) { return; } if(order.Items.Count > 15) { throw new Exception("The order " + order.Id + " has too many items"); } if(order.Status != "ReadyToProcess") { throw new Exception("The order " + order.Id + " isn't ready to process"); } order.IsProcessed = true; } static bool IsProcessable(Order? order) { return order is not null && order.IsVerified&& order.Items.Any() ) ``` 5๏ธโƒฃ ์‚ฌ์šฉ์ž ์ง€์ • ์˜ˆ์™ธ๋ฅผ ์„ ํ˜ธ ์ €๋Š” "์˜ˆ์™ธ"์ ์ธ ์ƒํ™ฉ์—์„œ๋งŒ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๊ณ , ์ฝ”๋“œ์—์„œ ํ๋ฆ„ ์ œ์–ด๋ฅผ ์œ„ํ•ด ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ๋„ ํ๋ฆ„ ์กฐ์ ˆ์— ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ``` public void Process(Order? order) { if(!Processable(order)) { return; } if(order.Items.Count > 15) { throw new TooManyLineItemsException(order.Id); } if(order.Status != "ReadyToProcess") { throw new NotReadyForProcessingException(order.Id); } order.IsProcessed = true; } static bool IsProcessable(Order? order) { return order is not null && order.IsVerified&& order.Items.Any() ) ``` 6๏ธโƒฃ ์ƒ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋งค์ง ๋„˜๋ฒ„ ๊ณ ์น˜๊ธฐ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ ๋ƒ„์ƒˆ๋Š” ๋งค์ง ๋„˜๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งค์ง ๋„˜๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ถ”๋ก ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋งค์ง ๋„˜๋ฒ„๋ฅผ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ด์•ผ ํ•˜๋ฉฐ, ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ ์ƒ์ˆ˜๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ``` const int MaxNumberOfLineItems = 15; public void Process(Order? order) { if(!Processable(order)) { return; } if(order.Items.Count > MaxNumberOfLineItems ) { throw new TooManyLineItemsException(order.Id); } if(order.Status != "ReadyToProcess") { throw new NotReadyForProcessingException(order.Id); } order.IsProcessed = true; } static bool IsProcessable(Order? order) { return order is not null && order.IsVerified&& order.Items.Any() ) ``` 7๏ธโƒฃ ๋งค์ง ์ŠคํŠธ๋ง์„ ์—ด๊ฑฐํ˜•์œผ๋กœ ๊ณ ์น˜๊ธฐ ๋งค์ง ๋„˜๋ฒ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋งค์ง ์ŠคํŠธ๋ง์—์„œ๋„ ์ฝ”๋“œ ๋ƒ„์ƒˆ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งค์ง ์ŠคํŠธ๋ง์˜ ์ „ํ˜•์ ์ธ ์‚ฌ๋ก€๋Š” ์ผ์ข…์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์„ ์ด์šฉํ•˜์—ฌ ๋งค์ง ์ŠคํŠธ๋ง์„ ๋‹ค๋ฃน์‹œ๋‹ค. ``` enum OrderStatus { Pending = 0, ReadyToProcess = 1, Processed = 2 } ``` 8๏ธโƒฃ Result Object Pattern ์‚ฌ์šฉ ์ €๋Š” ํ๋ฆ„ ์กฐ์ ˆ์— ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ฒฐ๊ณผ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์œ ํ˜•์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` public class ProcessOrderResult { public ProcessOrderResultType Type { get; } public long OrderId { get; } public string? Message { get; } public static ProcessOrderResult NotProcessable() => new(ProcessOrderResultType.NotProcessable, default, "Not processable"); public static ProcessOrderResult TooManyLineItems(long oderId) => new(ProcessOrderResultType.TooManyLineItems, orderId, "Too many items"); public static ProcessOrderResult NotReadyForProcessing(long oderId) => new(ProcessOrderResultType.NotReadyForProcessing, oderId, "Not ready"); public static ProcessOrderResult Success(long oderId) => new(ProcessOrderResultType.Success, oderId, "Success"); } ``` ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์€ ์˜๋„์ ์ธ ์—ฐ์Šต๊ณผ ๊ฒฝํ—˜์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ์ด ํด๋ฆฐ ์ฝ”๋“œ ์›๋ฆฌ์— ๋Œ€ํ•ด ์ฝ์ง€๋งŒ, ๋งค์ผ ์ ์šฉํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด๊ฒƒ์ด ๋‹น์‹ ์„ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿฃ ์›๋ฌธ์—์„œ ์ฝ”๋“œ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์กŒ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”!

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค