Upgrade to Pro — share decks privately, control downloads, hide ads and more …

オブジェクト指向とDependencyInjection / Object Oriented and Dependency Injection

オブジェクト指向とDependencyInjection / Object Oriented and Dependency Injection

ma310kano

July 25, 2019
Tweet

More Decks by ma310kano

Other Decks in Programming

Transcript

  1. アクセス修飾子(※1) 名称 可視・不可視 可変・不変 Private 不可視 (不可視の為、不変) Public ReadOnly(※2) 可視

    不変 Public 可視 可変 ※1 Internal、Protected および Protected Internal は割愛 ※2 フィールド(メンバ変数) および プロパティのみ
  2. Public Class MailSender #Region “Methods” Public Sub Send(message As String)

    Dim mime = CreateMimeMessage(message) client.Send(mime) End #End Region Non-Public Methods End Class
  3. Public Class FileCreator #Region “Methods” Public Function Create(filePath As String)

    As FileInfo CreateFile(filePath) Return New FileInfo(filePath) End #End Region Non-Public Methods End Class
  4. Public Class Voucher #Region “Properties” Public Property Id As Integer

    Get Return _id End Get Private Set(value As Integer) _id = value End Set End Property #End Region End Class
  5. Public Class Voucher #Region “Constructors” Public Sub New(id As Integer)

    Id = id ‘ ReadOnlyの為、コンストラクターでのみ設定可能 End #End Region #Region “Properties” Public ReadOnly Property Id As Integer #End Region End Class
  6. Public Class Voucher #Region “Properties” Public ReadOnly Property Id As

    Integer #End Region #Region “Methods” Public Overrides Function ToString() As String Return $”{NameOf(Id)} = {Id}” ‘ VS2015で挿入文字列およびNameOf演算子に対応 End Function #End Region End Class
  7. Public Class Child Inherits Parent #Region “Methods” Protected Overrides Sub

    ExecuteImpl() MyBase.ExecuteImpl() (省略) End Function #End Region End Class
  8. Public Class MailDeliveryService #Region “Methods” Public Sub Deliver() (ローカル変数 messageの作成)

    ‘ 添付ファイルを作成 Dim attachment = _attachmentCreator.Create(filePath) _mailSender.Send(message, attachment) End Function #End Region End Class
  9. #Region “Fields” Private ReadOnly _attachmentCreator As IFileCreator Private ReadOnly _mailSender

    As IMailSender #End Region #Region “Constructors” Public Sub New(attachmentCreator As IFileCreator mailSender As IMailSender) _attachmentCreator = attachmentCreator _mailSender = mailSender End Sub #End Region
  10. Public Interface IFileCreator #Region “Properties” ReadOnly Property FileType As FileTypeDivision

    #End Region #Region “Methods” Function Create(filePath As String) As FileInfo #End Region End Class
  11. Public Class ExcelFileCreator Implements IFileCreator #Region “Properties” Public ReadOnly Property

    FileType As FileTypeDivision Implements IFileCreator.FileType = FileTypeDivision.Excel #End Region #Region “Methods” Public Function Create(filePath As String) As FileInfo Implements IFileCreator.Create (Excelファイルを作成) End Function #End Region End Class
  12. Public Class PdfFileCreator Implements IFileCreator #Region “Properties” Public ReadOnly Property

    FileType As FileTypeDivision Implements IFileCreator.FileType = FileTypeDivision.Pdf #End Region #Region “Methods” Public Function Create(filePath As String) As FileInfo Implements IFileCreator.Create (PDFファイルを作成) End Function #End Region End Class
  13. Public Class MailDeliveryService #Region “Fields” Private ReadOnly _attachmentCreatorDic As IDictionary(Of

    FileTypeDivision, IFileCreator) = New Dictionary(Of FileTypeDivision, IFileCreator)() #End Region #Region “Methods” Public Sub Deliver() Dim fileType = order.FileType Dim attachment = _attachmentCreatorDic(fileType).Create(filePath) End Function #End Region End Class
  14. Public Class StubFileCreator Implements IFileCreator #Region “Properties” Public ReadOnly Property

    FileType As FileTypeDivision Implements IFileCreator.FileType = FileTypeDivision.None #End Region #Region “Methods” Public Function Create(filePath As String) As FileInfo Implements IFileCreator.Create Return New FileInfo(String.Empty) End Function #End Region End Class
  15. Public Class ChouCream #Region “Fields” Private ReadOnly _cream As ICream

    #End Region #Region “Constructors” Public Sub New(cream As ICream) _cream = cream End Sub #End Region End Class
  16. #Region “Methods” Public Sub Execute() Dim container = New UnityContainer()

    container.RegisterType(Of ICream, CustardCream)() ‘ クリームをタンクに詰める Dim shouCream = container.Resolve(Of ShouCream)() ‘ タンクから CustardCream が注入される End Sub #End Region
  17. #Region “Methods” Public Sub Execute() Dim container = New UnityContainer()

    container.RegisterType(Of ICream, ChocolateCream)(“ChocoCrem”) ‘ 名前を付けて登録する ‘ 作り方を登録する container.RegisterType(Of ShouCream)(“Choco”, New InjectionConstructor(container.Resolve(container.Resolve(Of ICream)(“ChocoCream”)))) Dim shouCream = container.Resolve(Of ShouCream)(“Choco”) End Sub #End Region
  18. 2通りの注入方法 • Constructor Injection(コンストラクターへの注入) • Property Injection(プロパティへの注入) 次の2点から Constructor Injection

    をオススメする 1. 生成時に注入する=最速で注入する為 2. 注入したオブジェクトを読み取り専用(ReadOnly)にできる為
  19. Public Class ChouCream #Region “Fields” Private ReadOnly _cream As ICream

    #End Region #Region “Constructors” Public Sub New(cream As ICream) _cream = cream End Sub #End Region End Class
  20. #Region “Methods” Public Sub Register() Dim container = New UnityContainer()

    container.RegisterType(Of ICream, CustardCream)() Dim service = New UnityServiceLocator(container) ServiceLocator.SetLocatorProvider(Function() service) End Sub Public Sub Execute() Dim shouCream = ServiceLocator.Current.GetInstance(Of ShouCream)() End Sub #End Region