- åæ§ïŒåçŽãªå€æŽã¯å€ãã®å Žæã«åœ±é¿ãããããã³ãŒããå€æŽããããšã¯å°é£ã§ãïŒ;
- éæ¢ïŒã³ãŒããä»ã®ããã°ã©ã ã§äœ¿çšã§ããã¢ãžã¥ãŒã«ã«åå²ããããšã¯å°é£ã§ãïŒ;
- ç²åºŠïŒã³ãŒãã®éçºããã³/ãŸãã¯ãã¹ãã¯ããªãé£ããïŒ;
- äžèŠãªè€éãïŒã³ãŒãã«ã¯æªäœ¿çšã®æ©èœããããŸãïŒ;
- äžèŠãªåçŸæ§ïŒã³ããŒ/貌ãä»ãïŒ;
- å¯èªæ§ãäœãïŒã³ãŒãã®æ©èœãç解ããã®ãé£ãããç¶æããã®ãé£ããïŒ;
- è匱æ§ïŒå°ããªå€æŽã§ãæ©èœãç°¡åã«ç Žãããšãã§ããŸãïŒ;
åé¡ã®ããèšèšãé¿ãããããã®äœ¿çšã®çµæãäºæž¬ãããããããã«ã圌ãã¯ç解ããŠåºå¥ã§ããå¿ èŠããããŸãã ãããã®çç¶ã¯ããããŒãããŒãã£ã³ã®èæžãã¢ãžã£ã€ã«ã®ååããã¿ãŒã³ãCïŒã®å®è·µãã§èª¬æãããŠããŸãã ãã ãããã®ãããã¯ã«é¢ããä»ã®ããã€ãã®ã¬ãã¥ãŒèšäºïŒã¡ãªã¿ã«ããã»ã©å€ãã¯ãããŸããïŒã®ããã«ãããªãç°¡åãªèª¬æãæäŸãããŠãããååãšããŠã³ãŒãäŸã¯ãããŸããã
ãããã®å åã®ããããã«å€ããå°ãªããçŠç¹ãåœãŠãããšã«ããããã®æ¬ ç¹ãä¿®æ£ããŠã¿ãŸãããã
åæ§
ãã§ã«äžã§ç€ºããããã«ãããŒãã³ãŒãã¯ãããšã现éšã§ãã£ãŠãå€æŽããã®ãé£ããå ŽåããããŸãã ã³ãŒããé »ç¹ã«å€æŽãããªãå ŽåããŸãã¯ãŸã£ããå€æŽãããªãå Žåãããã¯åé¡ã«ãªããŸããã ãããã£ãŠãã³ãŒãã¯ãŸã£ããåªããŠããŸãã ãããã圌ãå®æçã«å€æŽãå¿ èŠãšãããããè¡ãããšãå°é£ã«ãªããšã圌ã¯åé¡ãæ±ããŸãã ãããæ©èœããå Žåã§ãã
åæ§ã®äžè¬çãªã±ãŒã¹ã®1ã€ã¯ãæœè±¡åïŒã€ã³ã¿ãŒãã§ã€ã¹ãåºæ¬ã¯ã©ã¹ãªã©ïŒã䜿çšãã代ããã«ãã¯ã©ã¹ã¿ã€ããæ瀺çã«ç€ºãããšã§ãã 以äžã¯ãµã³ãã«ã³ãŒãã§ãã
class A { B _b; public A() { _b = new B(); } public void Foo() { // Do some custom logic. _b.DoSomething(); // Do some custom logic. } } class B { public void DoSomething() { // Do something } }
ããã§ãã¯ã©ã¹Aã¯ã¯ã©ã¹Bã«å³å¯ã«äŸåããŠããŸããã€ãŸããå°æ¥Bã®ä»£ããã«å¥ã®ã¯ã©ã¹ã䜿çšããããšã«ããå Žåãã¯ã©ã¹Aãå€æŽããå¿ èŠãããããããã¹ããç¹°ãè¿ããŸãã ããã«ãä»ã®å€ãã®ã¯ã©ã¹ãBã«å³å¯ã«äŸåããŠããå Žåãç¶æ³ã¯äœåºŠãè€éã«ãªãå¯èœæ§ããããŸãã
ãã®ç¶æ³ããæãåºãæ¹æ³ã¯ãæœè±¡åãã€ãŸãIComponentã€ã³ã¿ãŒãã§ã€ã¹ãå°å ¥ããã¯ã©ã¹Aã®ã³ã³ã¹ãã©ã¯ã¿ãŒïŒãŸãã¯äœããã®æ¹æ³ïŒãä»ããŠãã®ãããªäŸåé¢ä¿ãå°å ¥ããããšã§ãããã®å Žåãã¯ã©ã¹Aã¯ç¹å®ã®ã¯ã©ã¹Bã«äŸåããªããªããŸãããIComponentã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã«äŸåããŸãã ã¯ã©ã¹Bã¯ãIComponentã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããå¿ èŠããããŸãã
interface IComponent { void DoSomething(); } class A { IComponent _component; public A(IComponent component) { _component = component; } void Foo() { // Do some custom logic. _component.DoSomething(); // Do some custom logic. } } class B : IComponent { void DoSomething() { // Do something } }
ããå ·äœçãªäŸãæããŸãããã æ å ±ããã°ã«èšé²ããã¯ã©ã¹ã®ç¹å®ã®ã»ããïŒProductManagerãšConsumerïŒããããšããŸãã 圌ãã®ä»äºã¯ãããã€ãã®è£œåãããŒã¿ããŒã¹ã«ä¿åããããã«å¿ããŠæ³šæããããšã§ãã äž¡æ¹ã®ã¯ã©ã¹ã¯é¢é£ããã€ãã³ããèšé²ããŸãã ãŸãããã¡ã€ã«ãžã®ãã®ã³ã°ãè¡ãããŸããã ãã®ãããFileLoggerã¯ã©ã¹ã䜿çšãããŸããã ããã«ãã¯ã©ã¹ã¯ç°ãªãã¢ãžã¥ãŒã«ïŒã¢ã»ã³ããªïŒã«é 眮ãããŠããŸããã
// Module 1 (Client) static void Main() { var product = new Product("milk"); var productManager = new ProductManager(); productManager.AddProduct(product); var consumer = new Consumer(); consumer.PurchaseProduct(product.Name); } // Module 2 (Business logic) public class ProductManager { private readonly FileLogger _logger = new FileLogger(); public void AddProduct(Product product) { // Add the product to the database. _logger.Log("The product is added."); } } public class Consumer { private readonly FileLogger _logger = new FileLogger(); public void PurchaseProduct(string product) { // Purchase the product. _logger.Log("The product is purchased."); } } public class Product { public string Name { get; private set; } public Product(string name) { Name = name; } } // Module 3 (Logger implementation) public class FileLogger { const string FileName = "log.txt"; public void Log(string message) { // Write the message to the file. } }
æåã¯ãã¡ã€ã«ã ãã§ååã§ãããæ å ±ãåéããŠä¿åããããã«ããŒã¿ããŒã¹ãã¯ã©ãŠããµãŒãã¹ãªã©ã®ä»ã®ã¹ãã¬ãŒãžã«ãã°ãèšé²ããå¿ èŠãããå ŽåãFileLoggerã䜿çšããŠããžãã¹ããžãã¯ã¢ãžã¥ãŒã«ïŒã¢ãžã¥ãŒã«2ïŒã®ãã¹ãŠã®ã¯ã©ã¹ãå€æŽããå¿ èŠããããŸãã æçµçã«ãããã«ã¯æ³šæãå¿ èŠã§ãã ãã®åé¡ã解決ããã«ã¯ã以äžã«ç€ºãããã«ããã¬ãŒãæäœããããã®æœè±¡çãªã€ã³ã¿ãŒãã§ãŒã¹ãå°å ¥ã§ããŸãã
// Module 1 (Client) static void Main() { var logger = new FileLogger(); var product = new Product("milk"); var productManager = new ProductManager(logger); productManager.AddProduct(product); var consumer = new Consumer(logger); consumer.PurchaseProduct(product.Name); } // Module 2 (Business logic) class ProductManager { private readonly ILogger _logger; public ProductManager(ILogger logger) { _logger = logger; } public void AddProduct(Product product) { // Add the product to the database. _logger.Log("The product is added."); } } public class Consumer { private readonly ILogger _logger; public Consumer(ILogger logger) { _logger = logger; } public void PurchaseProduct(string product) { // Purchase the product. _logger.Log("The product is purchased."); } } public class Product { public string Name { get; private set; } public Product(string name) { Name = name; } } // Module 3 (interfaces) public interface ILogger { void Log(string message); } // Module 4 (Logger implementation) public class FileLogger : ILogger { const string FileName = "log.txt"; public virtual void Log(string message) { // Write the message to the file. } }
ãã®å Žåããã¬ãŒã®ã¿ã€ããå€æŽããå Žåãã¯ã©ã€ã¢ã³ãã³ãŒãïŒã¡ã€ã³ïŒãå€æŽããã ãã§ååã§ããããã«ããããã¬ãŒãåæåãããProductManagerãšConsumerã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«é 眮ãããŸãã ãããã£ãŠããã¬ãŒã®ã¿ã€ãã«é¢ããå€æŽããããžãã¹ããžãã¯ã¯ã©ã¹ãéããŸãããããã¯å®è¡ããå¿ èŠããããŸããã
䜿çšãããŠããã¯ã©ã¹ãžã®çŽæ¥åç §ã«å ããŠãã³ãŒããå€æŽããéã«åé¡ãåŒãèµ·ããä»ã®ãªãã·ã§ã³ã«ãã£ãŠåæ§ãæ瀺ã§ããŸãã ãã®ãããªãã®ã¯ç¡éã«ãããããããŸããããå¥ã®äŸãæããŠã¿ãŠãã ããã ã³ã³ãœãŒã«ã«å¹ŸäœåŠå³åœ¢ã®é åã衚瀺ããã³ãŒããããã€ãçšæããŠã¿ãŸãããã
static void Main() { var rectangle = new Rectangle() { W = 3, H = 5 }; var circle = new Circle() { R = 7 }; var shapes = new Shape[] { rectangle, circle }; ShapeHelper.ReportShapesSize(shapes); } class ShapeHelper { private static double GetShapeArea(Shape shape) { if (shape is Rectangle) { return ((Rectangle)shape).W * ((Rectangle)shape).H; } if (shape is Circle) { return 2 * Math.PI * ((Circle)shape).R * ((Circle)shape).R; } throw new InvalidOperationException("Not supported shape"); } public static void ReportShapesSize(Shape[] shapes) { foreach(Shape shape in shapes) { if (shape is Rectangle) { double area = GetShapeArea(shape); Console.WriteLine($"Rectangle's area is {area}"); } if (shape is Circle) { double area = GetShapeArea(shape); Console.WriteLine($"Circle's area is {area}"); } } } } public class Shape { } public class Rectangle : Shape { public double W { get; set; } public double H { get; set; } } public class Circle : Shape { public double R { get; set; } }
ãã®ã³ãŒãã¯ãæ°ããå³åœ¢ãè¿œå ãããšãã«ãShapeHelperã¯ã©ã¹ã®ã¡ãœãããå€æŽããå¿ èŠãããããšã瀺ããŠããŸãã 1ã€ã®ãªãã·ã§ã³ã¯ã以äžã«ç€ºãããã«ãã¬ã³ããªã³ã°ã¢ã«ãŽãªãºã ã幟äœåŠçå³åœ¢ïŒé·æ¹åœ¢ãšåïŒã®ã¯ã©ã¹èªäœã«è»¢éããããšã§ãã ããã«ãããåã¯ã©ã¹ã®é¢é£ããžãã¯ãåé¢ããããããã³ã³ãœãŒã«ã«æ å ±ãåºåããåã«ShapeHelperã¯ã©ã¹ã®è²¬ä»»ãçµã蟌ãŸããŸãã
static void Main() { var rectangle = new Rectangle() { W = 3, H = 5 }; var circle = new Circle() { R = 7 }; var shapes = new Shape[]() { rectangle, circle }; ShapeHelper.ReportShapesSize(shapes); } class ShapeHelper { public static void ReportShapesSize(Shape[] shapes) { foreach(Shape shape in shapes) { shape.Report(); } } } public abstract class Shape { public abstract void Report(); } public class Rectangle : Shape { public double W { get; set; } public double H { get; set; } public override void Report() { double area = W * H; Console.WriteLine($"Rectangle's area is {area}"); } } public class Circle : Shape { public double R { get; set; } public override void Report() { double area = 2 * Math.PI * R * R; Console.WriteLine($"Circle's area is {area}"); } }
ãã®çµæãç¶æ¿ãšããªã¢ãŒãã£ãºã ã䜿çšããŠæ°ããã¿ã€ãã®ã·ã§ã€ããè¿œå ããããã«ãå®éã«ShapeHelperã¯ã©ã¹ãéããŸããã
éãã
éæ¢ã¯ãã³ãŒããåå©çšå¯èœãªã¢ãžã¥ãŒã«ã«åå²ããè€éãã§çŸããŸãã ãã®çµæããããžã§ã¯ãã¯é²åããèœåã倱ããçµæãšããŠç«¶äºåã倱ãå¯èœæ§ããããŸãã
äŸãšããŠããã¹ãŠã®ã³ãŒããã¢ããªã±ãŒã·ã§ã³ïŒexeïŒã®å®è¡å¯èœãã¡ã€ã«ã«å®è£ ãããããžãã¹ããžãã¯ãåå¥ã®ã¢ãžã¥ãŒã«ãŸãã¯ã¯ã©ã¹ã«è»¢éããªãããã«èšèšããããã¹ã¯ãããããã°ã©ã ãèããŸãã ãã®åŸããã°ããããŠãããã°ã©ã éçºè ã®åã«æ¬¡ã®ããžãã¹èŠä»¶ãçããŸããã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãå€æŽããŠWebã¢ããªã±ãŒã·ã§ã³ã«ããŸãã
- ãµãŒãããŒãã£ã®ã¯ã©ã€ã¢ã³ããç¬èªã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããããã«ãããã°ã©ã æ©èœãWebãµãŒãã¹ã®ã»ãããšããŠå ¬éããŸãã
ãã®å Žåããã¹ãŠã®ããã°ã©ã ã³ãŒããå®è¡å¯èœã¢ãžã¥ãŒã«ã«é ç·ãããŠããããããããã®èŠä»¶ãæºããããšã¯å°é£ã§ãã
次ã®å³ã¯ããã®æ©èœã®åœ±é¿ãåããªãèšèšãšã¯å¯Ÿç §çã«ãåºå®èšèšã®äŸã瀺ããŠããŸãã ãããã¯ç Žç·ã§åºåãããŠããŸãã å³ãããããããã«ãåå©çšå¯èœãªã¢ãžã¥ãŒã«ïŒããžãã¯ïŒéã®ã³ãŒãã®é åžãããã³WebãµãŒãã¹ã¬ãã«ã§ã®æ©èœã®å ¬éã«ãããããŸããŸãªã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ïŒã¢ããªïŒã§äœ¿çšã§ããããã«ãªããééããªãå©ç¹ã§ãã

éããã¯ã¢ããªã·ãã¯ãã¶ã€ã³ãšãåŒã°ããŸãã ãããç³ã®ãããã¯ã®ããã«å°ãããŠäŸ¿å©ãªã³ãŒãã«åå²ããããšã¯å°é£ã§ãã ãã®åé¡ãåé¿ããæ¹æ³ã¯ïŒ èšèšæ®µéã§ã¯ãä»ã®ã·ã¹ãã ã§ããããã®æ©èœã䜿çšããå¯èœæ§ã«ã€ããŠèããããšããå§ãããŸãã åå©çšãããå¯èœæ§ã®ããã³ãŒãã¯ãããã«åå¥ã®ã¢ãžã¥ãŒã«ãšã¯ã©ã¹ã«é 眮ããã®ãæé©ã§ãã
ç²åºŠ
ç²åºŠã¯2ã€ã®ã¿ã€ãã«åé¡ã§ããŸãã
- ç²åºŠã®çºé;
- ç°å¢ã®ç²åºŠã
éçºã®ç²æ§ã¯ãéžæããã¢ããªã±ãŒã·ã§ã³èšèšã«åŸãã®ãæ¯èŒçé£ããããšã§ç€ºãããŸãã ããã¯ãããã°ã©ããŒãæºããå¿ èŠã®ããèŠä»¶ãå€ãããããã«ãã¯ããã«äŸ¿å©ãªéçºãã¹ããããšããäºå®ã«ããå¯èœæ§ããããŸãã ç°å¢ã®ç²æ§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®çµã¿ç«ãŠãå±éãããã³ãã¹ãã®ããã»ã¹ã®éå¹çæ§ã«çŸããŸãã
éçºç²åºŠã®ç°¡åãªäŸãšããŠãä»ã®ã³ã³ããŒãã³ãïŒã¢ãžã¥ãŒã«2ããã³ã¢ãžã¥ãŒã«3ïŒã§äœ¿çšããããã«å¥ã®ã¢ãžã¥ãŒã«ïŒã¢ãžã¥ãŒã«1ïŒã«ïŒèšèšã«ããïŒé 眮ããå¿ èŠãããå®æ°ã䜿çšããäœæ¥ãæããããšãã§ããŸãã
// Module 1 (Constants) static class Constants { public const decimal MaxSalary = 100M; public const int MaxNumberOfProducts = 100; } // Finance Module #using Module1 static class FinanceHelper { public static bool ApproveSalary(decimal salary) { return salary <= Constants.MaxSalary; } } // Marketing Module #using Module1 class ProductManager { public void MakeOrder() { int productsNumber = 0; while(productsNumber++ <= Constants.MaxNumberOfProducts) { // Purchase some product } } }
äœããã®çç±ã§ãå®æ°ã¢ãžã¥ãŒã«ã®ã¢ã»ã³ããªããã»ã¹ã«ããªãã®æéããããå Žåãéçºè ãã¢ãžã¥ãŒã«ã®çµäºãæåŸ ããããšã¯å°é£ã§ãã ããã«ãå®æ°ã¢ãžã¥ãŒã«ã«ã¯ãããžãã¹ããžãã¯ã®æ ¹æ¬çã«ç°ãªãéšåïŒéèã¢ãžã¥ãŒã«ãšããŒã±ãã£ã³ã°ã¢ãžã¥ãŒã«ïŒã«é¢é£ããéåžžã«ç°çš®ã®ãšã³ãã£ãã£ãå«ãŸããŠãããšããäºå®ã«æ³šæãæãããšãã§ããŸãã ã€ãŸããå®æ°ã®ã¢ãžã¥ãŒã«ã¯ãäºãã«ç¬ç«ããçç±ã§é »ç¹ã«å€æŽãããå¯èœæ§ããããå€æŽã®åæããã»ã¹ãšãã圢ã§è¿œå ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
ããã¯ãã¹ãŠãéçºããã»ã¹ãé ãããããã°ã©ãã«è² æ ããããå¯èœæ§ããããŸãã ç²æ§ã®äœãèšèšã®ãªãã·ã§ã³ã¯ãããžãã¹ããžãã¯ã®åã¢ãžã¥ãŒã«ã«1ã€ãã€ãå®æ°ã®åå¥ã®ã¢ãžã¥ãŒã«ãäœæããããåå¥ã®ã¢ãžã¥ãŒã«ãéžæããââã«å®æ°ãé©åãªå Žæã«è»¢éããããšã§ãã
ç°å¢ã®ç²æ§ã®äŸãšããŠã¯ããªã¢ãŒãã¯ã©ã€ã¢ã³ãä»®æ³ãã·ã³ã§ã®ã¢ããªã±ãŒã·ã§ã³ã®éçºãšãã¹ãããããŸãã ãã®ãããªã¯ãŒã¯ãããŒã¯ãã€ã³ã¿ãŒãããæ¥ç¶ãé ãããã«èããããªãå Žåããããéçºè ã¯èšè¿°ãããã³ãŒãã®çµ±åãã¹ããäœç³»çã«ç¡èŠã§ããŸãããã®æ©èœã䜿çšãããšãã¯ã©ã€ã¢ã³ãåŽã§åé¡ãçºçããå¯èœæ§ããããŸãïŒãã°ïŒã
äžèŠãªé£æ床
ãã®å Žåããã¶ã€ã³ã«ã¯çŸåšäœ¿çšãããŠããªãæ©èœããããŸãïŒã€ãŸããå°æ¥ã®ããã«ã§ããã䟿å©ãªå Žåã¯ã©ãã§ããããïŒã ãã®äºå®ã¯ãããã°ã©ã ã®ãµããŒããšä¿å®ãè€éã«ããéçºãšãã¹ãã®æéãå¢å ãããå¯èœæ§ããããŸãã ããšãã°ãããŒã¿ããŒã¹ããããŒã¿ãèªã¿èŸŒãå¿ èŠãããããã°ã©ã ãèããŠã¿ãŸãããã ãã®ããã«ãå¥ã®ã³ã³ããŒãã³ãã§äœ¿çšãããç¹å¥ãªDataManagerã³ã³ããŒãã³ããäœæãããŸããã
class DataManager { object[] GetData() { // Retrieve and return data } }
éçºè ããçŸåšäœ¿çšãããŠããªãããŒã¿ããŒã¹ã«ããŒã¿ãæžã蟌ãããã®æ°ããã¡ãœãããDataManagerã«è¿œå ããå ŽåïŒWriteDataïŒãããã¯å°æ¥çã«ã¯ã»ãšãã©äœ¿çšãããªãå¯èœæ§ããããŸãããããã¯äžå¿ èŠãªè€éãã®å åã§ãã
äžèŠãªè€éãã®ãã1ã€ã®äŸã¯ããããããå Žåã«å¯Ÿå¿ãããã€ã³ã¿ãŒãã§ã€ã¹ã§ãã ããšãã°ãæåååã®ãªããžã§ã¯ããåãå ¥ããåäžã®Processã¡ãœãããæã€ã€ã³ã¿ãŒãã§ã€ã¹ãèããŸãã
interface IProcessor { void Process(string message); }
ã¿ã¹ã¯ãå³å¯ã«å®çŸ©ãããæ§é ãæã€ç¹å®ã®ã¿ã€ãã®ã¡ãã»ãŒãžãåŠçããå Žåãéçºè ã«ãã®è¡ãæ¯åç¹å®ã®ã¿ã€ãã®ã¡ãã»ãŒãžã«ãã·ãªã¢ã©ã€ãºãããããããå³å¯ã«åæå®ãããã€ã³ã¿ãŒãã§ã€ã¹ãäœæããæ¹ãç°¡åã§ãã
å¥ã®ãã€ã³ãã¯ãããããŸã£ããå¿ èŠãªãå Žåã®èšèšãã¿ãŒã³ã«å¯Ÿããé床ã®ç±æã§ãã çµæãšããŠãããã¯ç²åºŠèšèšã«ã€ãªããå¯èœæ§ããããŸãã
æœåšçã«æªäœ¿çšã®ã³ãŒããæžãã®ã«æéãç¡é§ã«ããã®ã¯ãªãã§ããïŒ QAã¯å®éã«å ¬éããããµãŒãããŒãã£ã®ã¯ã©ã€ã¢ã³ãã䜿çšã§ããããã«ãªã£ãŠããããããã®ãããªã³ãŒãããã¹ãããããã«å¿ èŠã«ãªãå ŽåããããŸãã ããããªãªãŒã¹æéã䜿ãæãããŸãã å¯çšæ§ããåŸãããå©çãéçºãšãã¹ãã®ã³ã¹ããè¶ ããããšãæ¡ä»¶ã«ã®ã¿ãå°æ¥ã®æ©èœãèšå®ãã䟡å€ããããŸãã
äžèŠãªåçŸæ§
ããããéçºè ã®å€§å€æ°ã¯ãã®æ©èœã«åºäŒã£ããããŸãã¯åºããããŸãããããã¯ãåãããžãã¯ãŸãã¯ç¹å®ã®ã³ãŒãå šäœã®è€æ°ã®ã³ããŒããæããŸãã äž»ãªè åšã¯ãå€æŽãè¡ãéã®ãã®ãããªã³ãŒãã®è匱æ§ã§ããããå Žæã§äœããä¿®æ£ããåŸãå¥ã®å Žæã§ãããè¡ãã®ãå¿ããããšããããŸãã ãŸããã³ãŒãã«ãã®æ©èœããªãå Žåã«æ¯ã¹ãŠãå€æŽãè¡ãéã«ããå€ãã®æéãå¿ èŠã§ãã
äžå¿ èŠãªåçŸæ§ã¯ãéçºè ã®é倱ã®çµæã§ããå¯èœæ§ããããŸãããŸããã³ãŒããç¹°ãè¿ããªãããšã¯ããããè¡ããããã¯ããã«å°é£ã§å±éºãªå Žåãèšèšã®åæ§/è匱æ§ã®äž¡æ¹ã«ãªããŸãã ãã ãããããã«ããŠããåçŸæ§ãèš±å¯ããªãã§ãã ããããŸããåå©çšå¯èœãªã»ã¯ã·ã§ã³ãäžè¬çãªã¡ãœãããšã¯ã©ã¹ã«è»¢éããããšã«ãããã³ãŒãã絶ããæ¹åããå¿ èŠããããŸãã
èªã¿ã«ãã
ãã®çç¶ã¯ãã³ãŒãã®èªã¿åããšç解ãå°é£ã§ãããšããäºå®ïŒããã³ãã®çç±ïŒã«çŸããŠããŸãã å¯èªæ§ãäœãçç±ã¯ãã³ãŒãã®èšèšèŠä»¶ïŒæ§æãå€æ°ã®åœåãã¯ã©ã¹ãªã©ïŒã®éåãå®è£ ããžãã¯ã®æ··ä¹±ãªã©ã§ãã
以äžã¯ãããŒã«å€æ°ãæäœããã¡ãœãããå®è£ ããèªã¿ã«ããã³ãŒãã®äŸã§ãã
void Process_true_false(string trueorfalsevalue) { if (trueorfalsevalue.ToString().Length == 4) { // That means trueorfalsevalue is probably "true". Do something here. } else if (trueorfalsevalue.ToString().Length == 5) { // That means trueorfalsevalue is probably "false". Do something here. } else { throw new Exception("not true of false. that's not nice. return.") } }
ããã§ã¯ãããã€ãã®åé¡ã匷調ã§ããŸãã ãŸããã¡ãœãããšå€æ°ã®ååã¯ãäžè¬ã«åãå ¥ããããŠããèŠåã®å¯Ÿè±¡ã§ã¯ãããŸããã 第äºã«ãã¡ãœããã®å®è£ ã¯æé©ã§ã¯ãããŸããã
ãããããæååã§ã¯ãªãããŒã«å€ãããã«åãå ¥ããå¿ èŠããããŸãã ãã ããæååãåãå ¥ããå Žåã§ããã¡ãœããã®å é ã§ããŒã«å€ã«å€æããæååã®é·ãã決å®ããã¡ãœããã䜿çšããªãæ¹ãé©åã§ãã 第äžã«ãé€å€ããã¹ãïŒããã¯è¯ããããŸããïŒãããžãã¹ã¹ã¿ã€ã«ãšæ£åŒã«äžèŽããŠããŸããã ãã®ãããªããã¹ããèªããšãã³ãŒãã¯çŽ 人ã«ãã£ãŠæžããããšæãããããããŸããïŒããããéèŠãªãã€ã³ãã§ãããããã§ãïŒã ã¡ãœããã¯æ¬¡ã®ããã«æžãæããããšãã§ããŸãïŒæååã§ã¯ãªãããŒã«å€ãåãå ŽåïŒã
public void Process(bool value) { if (value) { // Do something. } else { // Do something. } }
次ã«ãå¥ã®ãªãã¡ã¯ã¿ãªã³ã°ãªãã·ã§ã³ã瀺ããŸãïŒãŸã æååãåãå ¥ããå¿ èŠãããå ŽåïŒã
public void Process(string value) { bool bValue = false; if (!bool.TryParse(value, out bValue)) { throw new ArgumentException($"The {value} is not boolean"); } if (bValue) { // Do something. } else { // Do something. } }
åé¡ãçºçãå§ããå Žåãèªã¿ã«ããã³ãŒãã«å¯ŸããŠãªãã¡ã¯ã¿ãªã³ã°ãå®è¡ããå¿ èŠããããŸãã ããšãã°ããã®ã¡ã³ããã³ã¹ãšäŒæãå€æ°ã®ãã°ã®åºçŸã«ã€ãªããå Žåã
ããã
ããã°ã©ã ã®è匱æ§ãšã¯ãå€æŽããã£ãå Žåã®å èš³ã®åçŽããæå³ããŸãã å èš³ã«ã¯ãã³ã³ãã€ã«ãšã©ãŒãšã©ã³ã¿ã€ã ãšã©ãŒã®2çš®é¡ããããŸãã åè ã¯åæ§ã®è£åŽã«ãªãå¯èœæ§ããããåŸè ã¯ã¯ã©ã€ã¢ã³ãåŽã«æ¢ã«ããããšãå€ããããæãå±éºã§ãã ããã§ããããã¯è匱æ§ã®ææšã§ãã
ã€ã³ãžã±ãŒã¿ã¯ééããªãçžå¯Ÿçã§ãã 誰ããéåžžã«æ éã«ã³ãŒããä¿®æ£ãã倱æã®å¯èœæ§ã¯äœãã§ãã ããã©ããã誰ã-æ¥ãã§ãäžæ³šæã§ã ããã§ããåããšã°ãŒãã¥ãŒã¿ãŒã§ã¯ãç°ãªãã³ãŒããç°ãªãæ°ã®ãšã©ãŒãçæããå¯èœæ§ããããŸãã ãããããå€èªãã«ããã»ã©è€éã«ãªããã³ã³ãã€ã«æ®µéã§ã¯ãªãããã°ã©ã ã®å®è¡æéã«äŸåããã»ã©è匱ã«ãªããŸãã
åæã«ãæ©èœã¯ãã°ãã°å€æŽãããããšãããªãã£ããšããããšãå£ããŸãã ããŸããŸãªã³ã³ããŒãã³ãã®ããžãã¯éã®æ¥ç¶æ§ãé«ããããåé¡ãçºçããå¯èœæ§ããããŸãã
ç¹å®ã®äŸãèããŠã¿ãŸãããã ããã§ãç¹å®ã®ããŒã«ïŒroleIdãã©ã¡ãŒã¿ãŒã«ãã£ãŠæ±ºå®ãããïŒã䜿çšãããŠãŒã¶ãŒèš±å¯ã®ããžãã¯ã¯ãç¹å®ã®ãªãœãŒã¹ïŒresourceUriïŒã«ã¢ã¯ã»ã¹ããããšã«ãããéçã¡ãœããã«ãã£ãŠã¢ã¯ã»ã¹ãããŸãã
static void Main() { if (Helper.Authorize(1, "/pictures")) { Console.WriteLine("Authorized"); } } class Helper { public static bool Authorize(int roleId, string resourceUri) { if (roleId == 1 || roleId == 10) { if (resourceUri == "/pictures") { return true; } } if (roleId == 1 || roleId == 2 && resourceUri == "/admin") { return true; } return false; } }
ããžãã¯ãããªããæ¯æ·±ããããšã«æ°ä»ããããããŸããã æããã«ãæ°ãã圹å²ãšãªãœãŒã¹ãè¿œå ãããšãç°¡åã«å£ããŠããŸããŸãã ãã®çµæãäžéšã®ããŒã«ãç¹å®ã®ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãååŸãŸãã¯åªå€±ããå ŽåããããŸãã 以äžã«ç€ºãããã«ããªãœãŒã¹èå¥åãšãµããŒããããŠããããŒã«ã®ãªã¹ããä¿åããResourceã¯ã©ã¹ãäœæãããšãè匱æ§ã軜æžãããŸãã
static void Main() { var picturesResource = new Resource() { Uri = "/pictures" }; picturesResource.AddRole(1); if (picturesResource.IsAvailable(1)) { Console.WriteLine("Authorized"); } } class Resource { private List<int> _roles = new List<int>(); public string Uri { get; set; } public void AddRole(int roleId) { _roles.Add(roleId); } public void RemoveRole(int roleId) { _roles.Remove(roleId); } public bool IsAvailable(int roleId) { return _roles.Contains(roleId); } }
ãã®å Žåãæ°ãããªãœãŒã¹ãšããŒã«ãè¿œå ããããã«ãæ¿èªããžãã¯ã³ãŒãã®å€æŽã¯ãŸã£ããå¿ èŠãããŸãããã€ãŸããæ¬è³ªçã«ç Žå£ãããã®ã¯ãããŸããã
å®è¡æãšã©ãŒããã£ããããã®ã«åœ¹ç«ã€ãã® æåãèªåããŠããããã¹ãã ãã¹ãããã»ã¹ãé©åã«ç·šæããã°ããã»ã©ãè匱ãªã³ãŒããã¯ã©ã€ã¢ã³ãåŽã«çŸãããšããä¿è·ã匷åãããŸãã
è匱æ§ã¯ãå€ãã®å Žåãåæ§ãèªã¿ããããäžå¿ èŠãªåçŸæ§ãªã©ããã¶ã€ã³ã®æªãã®è£è¿ãã§ãã
ãããã«
åé¡èšèšã®äž»ãªæ©èœã匷調ããŠèª¬æããããšããŸããã ãããã®ããã€ãã¯çžäºæ¥ç¶ãããŠããŸãã èšèšäžã®åé¡ãåžžã«å°é£ã«ã€ãªãããšã¯éãããçºçã®å¯èœæ§ã瀺ãã ãã§ããããšãæ確ã«ç解ããå¿ èŠããããŸãã ãããã®å åã®ãã¬ãŒã¹ãå°ãªãã»ã©ããã®ç¢ºçã¯äœããªããŸãã