際際滷

際際滷Share a Scribd company logo
丿舒弍仍仂仆亳
仗仂亠从于舒仆仆
  丼舒亳仆舒 2
仂亰亞仍礌亠仄仂
   Presentation pattern Model View Presenter
   丿舒弍仍仂仆亳 仗仂于亠亟仆从亳
   弌从仆 舒弍仍仂仆亳
   亠磻 于亢亠 于亟仂仄 仆舒仄 舒弍仍仂仆亳
Model View Presenter
亳亰仆舒亠仆仆
仂亰亟仍亠仆仆
 舒仆亳 亟仍 仗仂从舒亰
 仂亞从亳 仗仂亞舒仄亳
 亟仂弍舒亢亠仆仆 亟舒仆亳
弌仗仂于舒 Presenter          displays
      仗仂 亟
   从仂亳于舒舒,
 于亟仂弍舒亢舒 亟舒仆
                                                     舒仆 亟仍 仗仂从舒亰
                          updates

                View                      Model


   change
   request             Presenter                        fetches


                               舒于舒仆舒亢 亟舒仆, 仗亠亠亟舒 亟舒仆 仆舒
                                View, 亠舒亞 仆舒 亟 从仂亳于舒舒
View                Model



       Presenter
                             UI


  Domain       Data Access
亟仗仂于亟舒仍仆仂: Model
   仂仆亠亶仆亠 亟仍 亟舒仆亳 亟仍 于亟仂弍舒亢亠仆仆
   Supervising Controller: View 亰仆舒 仗仂 仂亟亠仍
   Passive View: View 仆亠 亰仆舒 仗仂 仂亟亠仍
   丐舒从仂亢 仄仂亢亠 弍亳 从仍舒仂仄 亰 仗亠亟仄亠仆仂 仂弍仍舒
亟仗仂于亟舒仍仆仂: View
  仂仄仂, 仗仂从舒亰 UI
 弌于仂ム 亠亰亠仆亠, 仗亠亠亟舒 亠弍亠 亶仂仄
 亠亠仆舒仗舒于仍 亟 从仂亳于舒舒 亠亰亠仆亠
 仂亢亠 亰仆舒亳 仗仂 仂亟亠仍
 弍仂 仄仂亢亠 仆舒亟舒于舒亳 亟亠舒仍仆亳亶 仆亠亠亶 亟仍
  于舒仆仂于仍亠仆仆 亟舒仆亳
 于亠舒 亟仂 从仂仆从亠仆仂亞仂 亠亰亠仆亠舒
亟仗仂于亟舒仍仆仂: Presenter
 亠舒亞 仆舒 亟 从仂亳于舒舒
 仆仂于仍ム View 亟舒仆亳仄亳 亰 仂亟亠仍
 仂亰弍舒于仍 View 于亟仗仂于亟舒仍仆仂 亰舒 仍仂亞从 舒
  于亰舒仄仂亟 亰 弍亰仆亠-从仍舒舒仄亳 舒 data access
   亠亰亠仆亠 仂亳仄 亟舒仆 亰 弍亰仆亠-于仆
   丐舒仆仂仄舒/仍于舒仆仆 亟舒仆亳
   亠亰亠仆亠 亰弍亠亞舒 亰仄仆亳, 亰仂弍仍亠仆 从仂亳于舒亠仄
 于亠舒 亟仂 View 亠亠亰 仆亠亠亶 IView
仂亟亳从舒
 Supervising Controller
   View 于亟仗仂于亟舒 亰舒 data binding 仂亟亠仍
   亠亰亠仆亠 仗亠亠亟舒 仂亟亠仍 仆舒 View
   亠亰亠仆亠 从亠 从仍舒亟仆亳仄亳 于亰舒仄仂亟礆亳
 Passive View
   亠亰亠仆亠 于亟仗仂于亟舒 亰舒 仗亠亠亟舒 从仂亢仆仂
    舒亳仆亳 亟舒仆亳 仆舒 View
   View 仍亳亠 于亟仂弍舒亢舒 仗亠亠亟舒仆 仗仂 亟舒仆
舒仂仂于
 Windows Forms
   仆ム 仂亰于亳仆亠仆 MVP 亠亶仄于仂从亳
 ASP.NET Web Forms
Strategy
public sealed class SurveysImporter {
    public void Import() {
        // ... initialize import here
        switch (GetFileStorageType(importContext)) {
            case SurveysStorageType.Xls:
                ImportFromExcel();
                break;
            case SurveysStorageType.Csv:
                ImportFromCsvFile();
                break;
            case ...
            default:
                DoNothingButLog();
                break;
        }
        // ... report import completed successfully
    }
public sealed class SurveysImporterWithStrategy
{
    private readonly IFileImporterStrategy
        fileImporterStrategy;

   public void Import()
   {
       // ... initialize import here
       fileImporterStrategy.Import();
       // ... report import completed successfully
   }
亳亰仆舒亠仆仆
 仆从舒仗仍 舒仍亞仂亳仄
 仄仆舒 舒 仂亰于亳仂从 舒仍亞仂亳仄 仂从亠仄仂 于亟
  从仍仆舒
 亳仆亠亠仆仆 仆舒弍仂于 亰仆仂 仗仂于亠亟仆从亳 亰 从仍舒
 丕仆亠仆仆 仄仂于仆亳 仂仗亠舒仂于
 丕仆亳从仆亠仆仆 亰仄仆亳 从仍舒 仗亳 亟仂亟舒于舒仆仆
  仆仂于仂亞仂 舒仍亞仂亳仄
亠舒仍亰舒
 弌于仂亠仆仆 从仍舒-舒亠亞 亟仍 从仂亢仆仂
  于舒舒 舒仍亞仂亳仄
 弌于仂亠仆仆 仗仍仆仂亞仂 仆亠亠亶 亟仍 于
  亳 舒仍亞仂亳仄于
 弌舒亠亞 仄仂亢亠 于亳从仂亳仂于于舒亳 从仍舒-
  从仍仆
 弍仂 仆亳亶 从仂仆亠从
public class FilesSender
{
    public void SendToServer(Directory directory, Context context)
    {
        if (context.SendTopLevelFilesFirst)
        {
            foreach (var file in directory.Files)
            {
                SendToServer(file);
            }
            foreach (var childDirectory in directory.Directories)
            {
                SendToServer(childDirectory, context);
            }
        }
Higher order functions
  舒亠亞礆亳
public class FilesSender
{
    private readonly
       Func<Directory, IEnumerable<File>> enumerateFiles;

   public FilesSenderWithStrategy(
        Func<Directory, IEnumerable<File>> directoryTraverser)
   {
       enumerateFiles = directoryTraverser;
   }

   public void SendToServer(Directory directory, Context context)
   {

       foreach (var file in   enumerateFiles(directory))
       {
           SendToServer(file);
       }
   }
Template Method
public class SurveysImporter
{
    public void Import()
    {
        InitializeImport();
        DoImport();
        NotifyUsers();
        ReportSuccessfullCompletion();
    }
public class CsvSurveysImporter :
    SurveysImporterWithTemplateMethod
{
    protected override void DoImport()
    {
        // CSV import implementation here
    }

    protected override void NotifyUsers()
    {
        // users notification implementation here
    }
}
亳亰仆舒亠仆仆
 仍亞仂亳仄 从仍舒亟舒 亰 亟亠从仍从仂 从仂从于
 亠舒仍亰舒 仂亟仆仂亞仂 从仂从 仄仂亢亠 亰仄仆ミ火委亳
 (舒弍仂 亟亠从仍从仂 从仂从于)
 仆从舒仗仍 仆亠亰仄仆仆仂 仗仂仍亟仂于仆仂 从仂从于
 仂亢仍亳于 亰舒亟舒亳 亠舒仍亰舒 从仂从于, 仂 仄仂亢
  亰仄仆ミ火委亳
 仄仆舒 从仂从于 舒仍亞仂亳仄 弍亠亰 亰仄仆亳 亶仂亞仂 从亳
亠舒仍亰舒
 亟从仍舒亳 仗亠亠于亳亰仆舒舒ム 仂从亠仄 从仂从亳
  舒仍亞仂亳仄, 于亳亰仆舒亠仆仂亞仂 于 弍舒亰仂于仂仄 从仍舒
 舒亰 仆舒 仆舒仍亟于舒仆仆
 仍亠仆舒亳于舒  Strategy
亳从仍舒亟
 ASP.NET page lifecycle
   OnInit(), OnLoad() etc.
Command
private void Import(Survey survey)
{
    if (survey.CreatedBy == currentUser &&
        survey.CreatedOn < DateTime.Today &&
        (
            new[] { SurveyState.New, SurveyState.Finished }
                .Contains(survey.State) ||
            survey.State == SurveyState.Paused &&
              !survey.HasAnswers
        ) &&
        !AlreadyExistsSurveyWithTitle(survey.Title))
    {
        // create new or update existing survey
    }
}
亳亰仆舒亠仆仆
 亠亟舒于仍亠仆仆 亟 磻 仂弍从舒
 亟亟仍亠仆仆 于亳从仂仆舒仆仆 亟 于亟 亟亠舒仍亠亶 
  亰舒仍亠亢仆仂亠亶, 仆亠仂弍亟仆亳 亟仍 亠舒仍亰舒 亟
 仂亟舒于舒仆仆 仆仂于亳 亟亶 弍亠亰 亰仄仆亳 从仍仆于
public interface ICommand
{
    void Execute();
}                    亠 仗亳亶仄舒
                       舒亞仄亠仆于


public interface ICommand<T>
{
    void ExecuteFor(T obj);
}
public class ImportSurveyCommand : ICommand<Survey>
{
    private readonly string currentUser;
    private readonly object importContext;

    public ImportSurveyCommand(string currentUser,
        object importContext)
    {
        this.currentUser = currentUser;
        this.importContext = importContext;
    }

    public void ExecuteFor(Survey obj)
    {
        // create new or update existing survey
    }
}
private void Import(Survey survey)
{
  if (survey.CreatedBy == currentUser &&
      ...)
  {
      var importSurvey = new ImportSurveyCommand(
           currentUser,
           GetImportContext());
      importSurvey.ExecuteFor(survey);
  }
}
仂仄舒仆亟舒 仄仂亢亠 于亳从仂亳仂于于舒亳 亟仍
       undo 仆从仂仆舒仍仆仂
public interface ICommand
{
    bool CanExecute();
    void Execute();
    void Undo();
}
Specification
private void Import(Survey survey)
{
    if (survey.CreatedBy == currentUser &&
        survey.CreatedOn < DateTime.Today &&
        (
            new[] { SurveyState.New, SurveyState.Finished }
                .Contains(survey.State) ||
            survey.State == SurveyState.Paused &&
              !survey.HasAnswers
        ) &&
        !AlreadyExistsSurveyWithTitle(survey.Title))
    {
        // create new or update existing survey
    }
}
亠亠亟仄仂于亳
   亰仆亠-仗舒于亳仍仂 仄亳 弍舒亞舒仂 从仂亟
   舒于亳仍仂 仍仂亞仆仂 从仍舒亟仆亠
   舒于亳仍仂 仄仂亢亠 舒仂 亰仄仆ミ火委亳
   舒于亳仍 仄仂亢亠 弍亳 亟亠从仍从舒

 亳亰仆舒亠仆仆: 仗仂亠仆仆 从仂亟 从仍舒-从仍仆舒
public interface ISpecification<T>
{
    bool IsSatisfiedBy(T obj);
}


public class SurveyShouldBeImported :
    ISpecification<Survey>
{
    public bool IsSatisfiedBy(Survey obj)
    {
        // ...
    }
}
亠舒仍亰舒
 仆从舒仗仍ム 弍仍亠于亠 弍亰仆亠-仗舒于亳仍仂
 仂亢仍亳于 从仂仄仗仂亰亳仆 弌仗亠亳从舒
   AndSpecification, OrSpecification,
    NotSpecification
 仂亢仍亳于亠 仗仂亟仆舒仆仆 仂仄舒仆亟 舒
  弌仗亠亳从舒亶
public class AndSpecification<T> : ISpecification<T>
{
    private readonly ISpecification<T> first;
    private readonly ISpecification<T> second;

    public AndSpecification(ISpecification<T> first,
        ISpecification<T> second)
    {
        this.first = first;
        this.second = second;
    }

    public bool IsSatisfiedBy(T obj)
    {
        return first.IsSatisfiedBy(obj) &&
            second.IsSatisfiedBy(obj);
    }
}
Adapter
亳亰仆舒亠仆仆
 仍舒亳-从仍仆亳 于亳从仂亳仂于ム 仗亠于仆亳亶
  仆亠亠亶
 仂弍仆亠 仗亠亠于仂亠仆仆 仆亠亠亶 仂亟仆仂亞仂
  从仍舒 于 仆亠亠亶 仆仂亞仂
 仍 于亳从仂亳舒仆仆 仆ム亳 从仍舒于
 亟舒仗 仂亟亳仆 仆亠亠亶 亟仂 仆仂亞仂
亳从仍舒亟
public interface ISurveyRepository
{
    IList<Survey> GetAll();
    Survey Get(int id);
}
Decorator
亳亰仆舒亠仆仆
 仄仆舒 仗仂于亠亟仆从亳 仂弍从舒 弍亠亰 亰仄仆亳
  仆亠亠亶
 仂亟舒仆仆 仆从仂仆舒仍仆仂 亟亳仆舒仄仆仂
 亳从仍舒亟: 仂亟舒于舒仆仆 于舒仍亟舒
public interface ISurveysImporter
{
    void Import();
}
public sealed class SurveysImporter :
    ISurveysImporter
{
    ...
    public void Import()
    {
        // ... initialize import here
        fileImporterStrategy.Import();
        // ... report completed successfully
    }
}
public sealed class SecurityCheckingSurveysImporter :
    ISurveysImporter
    {
        private readonly ISurveysImporter importer;

       public void Import()
       {
           if (GetCurrentUserRole() != "Admin")
           {
               throw new InvalidOperationException(
                 "User is not allowed to import surveys.");
           }
           importer.Import();
       }
...
亠舒仍亰舒
 亠从仂舒仂 亠舒仍亰 仆亠亠亶 仗仂舒从仂于仂亞仂
  仂弍从
 亠从仂舒仂 亰弍亠亞舒 仗仂亳仍舒仆仆 仆舒
  仗仂舒从仂于亳亶 仂弍从
 仂舒从仂于亳亶 仂弍从 仆亠 亰仆舒 仗仂 亟仂亟舒从仂于
  仆从仂仆舒仍仆
 亠从仂舒仂亳 仄仂亢 仗仂亟仆于舒亳
 仂仄仗仂亰亳 亰舒仄 仆舒仍亟于舒仆仆
亢亠 于亟仂仄 舒弍仍仂仆亳
 Iterator
    IEnumerable<T> + IEnumerator<T>
    yield return -- 从仂仄仗仍仂 舒仄 亞亠仆亠 亠舒仂
 Observer
    C# events, based on delegates
 Proxy
    仂仗 亟仂 于亠弍-亠于于
 MVC
 Repository

More Related Content

What's hot (7)

01 c# basics
01 c# basics01 c# basics
01 c# basics
eleksdev
tsql
tsqltsql
tsql
eleksdev
Windows service
Windows serviceWindows service
Windows service
eleksdev
SQL: Indexes, Select operator
SQL: Indexes, Select operatorSQL: Indexes, Select operator
SQL: Indexes, Select operator
eleksdev
SQL Grouping, Joins
SQL Grouping, JoinsSQL Grouping, Joins
SQL Grouping, Joins
eleksdev
10 asp.net
10 asp.net 10 asp.net
10 asp.net
eleksdev
Clean code (UA)
Clean code (UA)Clean code (UA)
Clean code (UA)
Oleksandr Pavlyshak
01 c# basics
01 c# basics01 c# basics
01 c# basics
eleksdev
Windows service
Windows serviceWindows service
Windows service
eleksdev
SQL: Indexes, Select operator
SQL: Indexes, Select operatorSQL: Indexes, Select operator
SQL: Indexes, Select operator
eleksdev
SQL Grouping, Joins
SQL Grouping, JoinsSQL Grouping, Joins
SQL Grouping, Joins
eleksdev
10 asp.net
10 asp.net 10 asp.net
10 asp.net
eleksdev

Viewers also liked (10)

Oop - TTm
Oop - TTmOop - TTm
Oop - TTm
Vitaliy Galushka
#3 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 2)
#3 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 2)#3 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 2)
#3 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 2)
Victor Matyushevskyy
弌仂舒于仆亠 舒亳 仂弍亠从仆仂亞仂 仗仂亟仂亟舒
弌仂舒于仆亠 舒亳 仂弍亠从仆仂亞仂 仗仂亟仂亟舒弌仂舒于仆亠 舒亳 仂弍亠从仆仂亞仂 仗仂亟仂亟舒
弌仂舒于仆亠 舒亳 仂弍亠从仆仂亞仂 仗仂亟仂亟舒
Ural Federal University named after First President of Russia B.N. Yeltsin
Mobile applications development
Mobile applications developmentMobile applications development
Mobile applications development
Victor Matyushevskyy
仗亳仆亳仗 仂仂仗 亳 仗仂亞舒仄仄亳仂于舒仆亳亠 从仍舒仂于 于 C#
仗亳仆亳仗 仂仂仗 亳 仗仂亞舒仄仄亳仂于舒仆亳亠 从仍舒仂于 于 C#仗亳仆亳仗 仂仂仗 亳 仗仂亞舒仄仄亳仂于舒仆亳亠 从仍舒仂于 于 C#
仗亳仆亳仗 仂仂仗 亳 仗仂亞舒仄仄亳仂于舒仆亳亠 从仍舒仂于 于 C#
bolevik
Python: 仂亟仍亳 亳 仗舒从亠
Python: 仂亟仍亳 亳 仗舒从亠Python: 仂亟仍亳 亳 仗舒从亠
Python: 仂亟仍亳 亳 仗舒从亠
Theoretical mechanics department
Social networking
Social networkingSocial networking
Social networking
vishnukdixit

Similar to Design patterns part 2 (20)

[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
Exoft LLC
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
Igor Bronovskyy
舒亞舒仍仆 仗亳仆亳仗亳 仂亰仂弍仍亠仆仆 仂仗亠舒仂舒 仆舒 弍舒亰 SCADA/HMI
舒亞舒仍仆 仗亳仆亳仗亳 仂亰仂弍仍亠仆仆  仂仗亠舒仂舒 仆舒 弍舒亰 SCADA/HMI舒亞舒仍仆 仗亳仆亳仗亳 仂亰仂弍仍亠仆仆  仂仗亠舒仂舒 仆舒 弍舒亰 SCADA/HMI
舒亞舒仍仆 仗亳仆亳仗亳 仂亰仂弍仍亠仆仆 仂仗亠舒仂舒 仆舒 弍舒亰 SCADA/HMI
仗亠仆舒 仍亠从舒仆亟
Lec12 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆 ed
Lec12 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆 edLec12 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆 ed
Lec12 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆 ed
cit-cit
CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"
Bohdan Pashkovskyi
Lec11 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆
Lec11 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆Lec11 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆
Lec11 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆
cit-cit
亠从 12 亠亠亟舒舒 仗舒舒仄亠于 仆从.pptx
亠从 12 亠亠亟舒舒 仗舒舒仄亠于  仆从.pptx亠从 12 亠亠亟舒舒 仗舒舒仄亠于  仆从.pptx
亠从 12 亠亠亟舒舒 仗舒舒仄亠于 仆从.pptx
ssuserf57884
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
Exoft LLC
Code driven testing (UA)
Code driven testing (UA)Code driven testing (UA)
Code driven testing (UA)
Oleksandr Pavlyshak
Anton Serputko Start performance-testing-from-scratch, BAQ
Anton Serputko Start performance-testing-from-scratch, BAQAnton Serputko Start performance-testing-from-scratch, BAQ
Anton Serputko Start performance-testing-from-scratch, BAQ
Dakiry
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
Fwdays
仆 仗亟亳亠仄亳
仆 仗亟亳亠仄亳仆 仗亟亳亠仄亳
仆 仗亟亳亠仄亳
仗亠仆舒 仍亠从舒仆亟
Lecture 06. iOS Programming. 仆仂于亳 Objective-C
Lecture 06. iOS Programming. 仆仂于亳 Objective-CLecture 06. iOS Programming. 仆仂于亳 Objective-C
Lecture 06. iOS Programming. 仆仂于亳 Objective-C
Maksym Davydov
Igor Dumbur: 仆亢亠仆亠仆舒 亟仂从仂仆舒仍 舒 DevOps(UA)
Igor Dumbur: 仆亢亠仆亠仆舒 亟仂从仂仆舒仍 舒 DevOps(UA)Igor Dumbur: 仆亢亠仆亠仆舒 亟仂从仂仆舒仍 舒 DevOps(UA)
Igor Dumbur: 仆亢亠仆亠仆舒 亟仂从仂仆舒仍 舒 DevOps(UA)
content75
丐亠于舒仆仆 仗亳 仂亰仂弍 仗仂亞舒仄仆仂亞仂 亰舒弍亠亰仗亠亠仆仆. Unit Tests.
丐亠于舒仆仆 仗亳 仂亰仂弍 仗仂亞舒仄仆仂亞仂 亰舒弍亠亰仗亠亠仆仆. Unit Tests.丐亠于舒仆仆 仗亳 仂亰仂弍 仗仂亞舒仄仆仂亞仂 亰舒弍亠亰仗亠亠仆仆. Unit Tests.
丐亠于舒仆仆 仗亳 仂亰仂弍 仗仂亞舒仄仆仂亞仂 亰舒弍亠亰仗亠亠仆仆. Unit Tests.
Elantix
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
Igor Bronovskyy
Web service lecture
Web service lectureWeb service lecture
Web service lecture
eleksdev
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
Exoft LLC
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
Igor Bronovskyy
舒亞舒仍仆 仗亳仆亳仗亳 仂亰仂弍仍亠仆仆 仂仗亠舒仂舒 仆舒 弍舒亰 SCADA/HMI
舒亞舒仍仆 仗亳仆亳仗亳 仂亰仂弍仍亠仆仆  仂仗亠舒仂舒 仆舒 弍舒亰 SCADA/HMI舒亞舒仍仆 仗亳仆亳仗亳 仂亰仂弍仍亠仆仆  仂仗亠舒仂舒 仆舒 弍舒亰 SCADA/HMI
舒亞舒仍仆 仗亳仆亳仗亳 仂亰仂弍仍亠仆仆 仂仗亠舒仂舒 仆舒 弍舒亰 SCADA/HMI
仗亠仆舒 仍亠从舒仆亟
Lec12 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆 ed
Lec12 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆 edLec12 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆 ed
Lec12 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆 ed
cit-cit
CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"
Bohdan Pashkovskyi
Lec11 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆
Lec11 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆Lec11 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆
Lec11 从仂亳于舒从i 亠仍亠仄亠仆亳 从亠于舒仆仆
cit-cit
亠从 12 亠亠亟舒舒 仗舒舒仄亠于 仆从.pptx
亠从 12 亠亠亟舒舒 仗舒舒仄亠于  仆从.pptx亠从 12 亠亠亟舒舒 仗舒舒仄亠于  仆从.pptx
亠从 12 亠亠亟舒舒 仗舒舒仄亠于 仆从.pptx
ssuserf57884
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
Exoft LLC
Anton Serputko Start performance-testing-from-scratch, BAQ
Anton Serputko Start performance-testing-from-scratch, BAQAnton Serputko Start performance-testing-from-scratch, BAQ
Anton Serputko Start performance-testing-from-scratch, BAQ
Dakiry
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
Fwdays
Lecture 06. iOS Programming. 仆仂于亳 Objective-C
Lecture 06. iOS Programming. 仆仂于亳 Objective-CLecture 06. iOS Programming. 仆仂于亳 Objective-C
Lecture 06. iOS Programming. 仆仂于亳 Objective-C
Maksym Davydov
Igor Dumbur: 仆亢亠仆亠仆舒 亟仂从仂仆舒仍 舒 DevOps(UA)
Igor Dumbur: 仆亢亠仆亠仆舒 亟仂从仂仆舒仍 舒 DevOps(UA)Igor Dumbur: 仆亢亠仆亠仆舒 亟仂从仂仆舒仍 舒 DevOps(UA)
Igor Dumbur: 仆亢亠仆亠仆舒 亟仂从仂仆舒仍 舒 DevOps(UA)
content75
丐亠于舒仆仆 仗亳 仂亰仂弍 仗仂亞舒仄仆仂亞仂 亰舒弍亠亰仗亠亠仆仆. Unit Tests.
丐亠于舒仆仆 仗亳 仂亰仂弍 仗仂亞舒仄仆仂亞仂 亰舒弍亠亰仗亠亠仆仆. Unit Tests.丐亠于舒仆仆 仗亳 仂亰仂弍 仗仂亞舒仄仆仂亞仂 亰舒弍亠亰仗亠亠仆仆. Unit Tests.
丐亠于舒仆仆 仗亳 仂亰仂弍 仗仂亞舒仄仆仂亞仂 亰舒弍亠亰仗亠亠仆仆. Unit Tests.
Elantix
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
Igor Bronovskyy
Web service lecture
Web service lectureWeb service lecture
Web service lecture
eleksdev

More from Victor Matyushevskyy (13)

仆仂于亳 舒亰 亟舒仆亳 舒 MS SQL Server
仆仂于亳 舒亰 亟舒仆亳 舒 MS SQL Server仆仂于亳 舒亰 亟舒仆亳 舒 MS SQL Server
仆仂于亳 舒亰 亟舒仆亳 舒 MS SQL Server
Victor Matyushevskyy
06.1 .Net memory management
06.1 .Net memory management06.1 .Net memory management
06.1 .Net memory management
Victor Matyushevskyy
06 LINQ
06 LINQ06 LINQ
06 LINQ
Victor Matyushevskyy
05 functional programming
05 functional programming05 functional programming
05 functional programming
Victor Matyushevskyy
04 standard class library c#
04 standard class library c#04 standard class library c#
04 standard class library c#
Victor Matyushevskyy
#2 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 1)
#2 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 1)#2 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 1)
#2 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 1)
Victor Matyushevskyy

Design patterns part 2

  • 2. 仂亰亞仍礌亠仄仂 Presentation pattern Model View Presenter 丿舒弍仍仂仆亳 仗仂于亠亟仆从亳 弌从仆 舒弍仍仂仆亳 亠磻 于亢亠 于亟仂仄 仆舒仄 舒弍仍仂仆亳
  • 4. 亳亰仆舒亠仆仆 仂亰亟仍亠仆仆 舒仆亳 亟仍 仗仂从舒亰 仂亞从亳 仗仂亞舒仄亳 亟仂弍舒亢亠仆仆 亟舒仆亳
  • 5. 弌仗仂于舒 Presenter displays 仗仂 亟 从仂亳于舒舒, 于亟仂弍舒亢舒 亟舒仆 舒仆 亟仍 仗仂从舒亰 updates View Model change request Presenter fetches 舒于舒仆舒亢 亟舒仆, 仗亠亠亟舒 亟舒仆 仆舒 View, 亠舒亞 仆舒 亟 从仂亳于舒舒
  • 6. View Model Presenter UI Domain Data Access
  • 7. 亟仗仂于亟舒仍仆仂: Model 仂仆亠亶仆亠 亟仍 亟舒仆亳 亟仍 于亟仂弍舒亢亠仆仆 Supervising Controller: View 亰仆舒 仗仂 仂亟亠仍 Passive View: View 仆亠 亰仆舒 仗仂 仂亟亠仍 丐舒从仂亢 仄仂亢亠 弍亳 从仍舒仂仄 亰 仗亠亟仄亠仆仂 仂弍仍舒
  • 8. 亟仗仂于亟舒仍仆仂: View 仂仄仂, 仗仂从舒亰 UI 弌于仂ム 亠亰亠仆亠, 仗亠亠亟舒 亠弍亠 亶仂仄 亠亠仆舒仗舒于仍 亟 从仂亳于舒舒 亠亰亠仆亠 仂亢亠 亰仆舒亳 仗仂 仂亟亠仍 弍仂 仄仂亢亠 仆舒亟舒于舒亳 亟亠舒仍仆亳亶 仆亠亠亶 亟仍 于舒仆仂于仍亠仆仆 亟舒仆亳 于亠舒 亟仂 从仂仆从亠仆仂亞仂 亠亰亠仆亠舒
  • 9. 亟仗仂于亟舒仍仆仂: Presenter 亠舒亞 仆舒 亟 从仂亳于舒舒 仆仂于仍ム View 亟舒仆亳仄亳 亰 仂亟亠仍 仂亰弍舒于仍 View 于亟仗仂于亟舒仍仆仂 亰舒 仍仂亞从 舒 于亰舒仄仂亟 亰 弍亰仆亠-从仍舒舒仄亳 舒 data access 亠亰亠仆亠 仂亳仄 亟舒仆 亰 弍亰仆亠-于仆 丐舒仆仂仄舒/仍于舒仆仆 亟舒仆亳 亠亰亠仆亠 亰弍亠亞舒 亰仄仆亳, 亰仂弍仍亠仆 从仂亳于舒亠仄 于亠舒 亟仂 View 亠亠亰 仆亠亠亶 IView
  • 10. 仂亟亳从舒 Supervising Controller View 于亟仗仂于亟舒 亰舒 data binding 仂亟亠仍 亠亰亠仆亠 仗亠亠亟舒 仂亟亠仍 仆舒 View 亠亰亠仆亠 从亠 从仍舒亟仆亳仄亳 于亰舒仄仂亟礆亳 Passive View 亠亰亠仆亠 于亟仗仂于亟舒 亰舒 仗亠亠亟舒 从仂亢仆仂 舒亳仆亳 亟舒仆亳 仆舒 View View 仍亳亠 于亟仂弍舒亢舒 仗亠亠亟舒仆 仗仂 亟舒仆
  • 11. 舒仂仂于 Windows Forms 仆ム 仂亰于亳仆亠仆 MVP 亠亶仄于仂从亳 ASP.NET Web Forms
  • 13. public sealed class SurveysImporter { public void Import() { // ... initialize import here switch (GetFileStorageType(importContext)) { case SurveysStorageType.Xls: ImportFromExcel(); break; case SurveysStorageType.Csv: ImportFromCsvFile(); break; case ... default: DoNothingButLog(); break; } // ... report import completed successfully }
  • 14. public sealed class SurveysImporterWithStrategy { private readonly IFileImporterStrategy fileImporterStrategy; public void Import() { // ... initialize import here fileImporterStrategy.Import(); // ... report import completed successfully }
  • 15. 亳亰仆舒亠仆仆 仆从舒仗仍 舒仍亞仂亳仄 仄仆舒 舒 仂亰于亳仂从 舒仍亞仂亳仄 仂从亠仄仂 于亟 从仍仆舒 亳仆亠亠仆仆 仆舒弍仂于 亰仆仂 仗仂于亠亟仆从亳 亰 从仍舒 丕仆亠仆仆 仄仂于仆亳 仂仗亠舒仂于 丕仆亳从仆亠仆仆 亰仄仆亳 从仍舒 仗亳 亟仂亟舒于舒仆仆 仆仂于仂亞仂 舒仍亞仂亳仄
  • 16. 亠舒仍亰舒 弌于仂亠仆仆 从仍舒-舒亠亞 亟仍 从仂亢仆仂 于舒舒 舒仍亞仂亳仄 弌于仂亠仆仆 仗仍仆仂亞仂 仆亠亠亶 亟仍 于 亳 舒仍亞仂亳仄于 弌舒亠亞 仄仂亢亠 于亳从仂亳仂于于舒亳 从仍舒- 从仍仆 弍仂 仆亳亶 从仂仆亠从
  • 17. public class FilesSender { public void SendToServer(Directory directory, Context context) { if (context.SendTopLevelFilesFirst) { foreach (var file in directory.Files) { SendToServer(file); } foreach (var childDirectory in directory.Directories) { SendToServer(childDirectory, context); } }
  • 18. Higher order functions 舒亠亞礆亳
  • 19. public class FilesSender { private readonly Func<Directory, IEnumerable<File>> enumerateFiles; public FilesSenderWithStrategy( Func<Directory, IEnumerable<File>> directoryTraverser) { enumerateFiles = directoryTraverser; } public void SendToServer(Directory directory, Context context) { foreach (var file in enumerateFiles(directory)) { SendToServer(file); } }
  • 21. public class SurveysImporter { public void Import() { InitializeImport(); DoImport(); NotifyUsers(); ReportSuccessfullCompletion(); }
  • 22. public class CsvSurveysImporter : SurveysImporterWithTemplateMethod { protected override void DoImport() { // CSV import implementation here } protected override void NotifyUsers() { // users notification implementation here } }
  • 23. 亳亰仆舒亠仆仆 仍亞仂亳仄 从仍舒亟舒 亰 亟亠从仍从仂 从仂从于 亠舒仍亰舒 仂亟仆仂亞仂 从仂从 仄仂亢亠 亰仄仆ミ火委亳 (舒弍仂 亟亠从仍从仂 从仂从于) 仆从舒仗仍 仆亠亰仄仆仆仂 仗仂仍亟仂于仆仂 从仂从于 仂亢仍亳于 亰舒亟舒亳 亠舒仍亰舒 从仂从于, 仂 仄仂亢 亰仄仆ミ火委亳 仄仆舒 从仂从于 舒仍亞仂亳仄 弍亠亰 亰仄仆亳 亶仂亞仂 从亳
  • 24. 亠舒仍亰舒 亟从仍舒亳 仗亠亠于亳亰仆舒舒ム 仂从亠仄 从仂从亳 舒仍亞仂亳仄, 于亳亰仆舒亠仆仂亞仂 于 弍舒亰仂于仂仄 从仍舒 舒亰 仆舒 仆舒仍亟于舒仆仆 仍亠仆舒亳于舒 Strategy
  • 25. 亳从仍舒亟 ASP.NET page lifecycle OnInit(), OnLoad() etc.
  • 27. private void Import(Survey survey) { if (survey.CreatedBy == currentUser && survey.CreatedOn < DateTime.Today && ( new[] { SurveyState.New, SurveyState.Finished } .Contains(survey.State) || survey.State == SurveyState.Paused && !survey.HasAnswers ) && !AlreadyExistsSurveyWithTitle(survey.Title)) { // create new or update existing survey } }
  • 28. 亳亰仆舒亠仆仆 亠亟舒于仍亠仆仆 亟 磻 仂弍从舒 亟亟仍亠仆仆 于亳从仂仆舒仆仆 亟 于亟 亟亠舒仍亠亶 亰舒仍亠亢仆仂亠亶, 仆亠仂弍亟仆亳 亟仍 亠舒仍亰舒 亟 仂亟舒于舒仆仆 仆仂于亳 亟亶 弍亠亰 亰仄仆亳 从仍仆于
  • 29. public interface ICommand { void Execute(); } 亠 仗亳亶仄舒 舒亞仄亠仆于 public interface ICommand<T> { void ExecuteFor(T obj); }
  • 30. public class ImportSurveyCommand : ICommand<Survey> { private readonly string currentUser; private readonly object importContext; public ImportSurveyCommand(string currentUser, object importContext) { this.currentUser = currentUser; this.importContext = importContext; } public void ExecuteFor(Survey obj) { // create new or update existing survey } }
  • 31. private void Import(Survey survey) { if (survey.CreatedBy == currentUser && ...) { var importSurvey = new ImportSurveyCommand( currentUser, GetImportContext()); importSurvey.ExecuteFor(survey); } }
  • 32. 仂仄舒仆亟舒 仄仂亢亠 于亳从仂亳仂于于舒亳 亟仍 undo 仆从仂仆舒仍仆仂 public interface ICommand { bool CanExecute(); void Execute(); void Undo(); }
  • 34. private void Import(Survey survey) { if (survey.CreatedBy == currentUser && survey.CreatedOn < DateTime.Today && ( new[] { SurveyState.New, SurveyState.Finished } .Contains(survey.State) || survey.State == SurveyState.Paused && !survey.HasAnswers ) && !AlreadyExistsSurveyWithTitle(survey.Title)) { // create new or update existing survey } }
  • 35. 亠亠亟仄仂于亳 亰仆亠-仗舒于亳仍仂 仄亳 弍舒亞舒仂 从仂亟 舒于亳仍仂 仍仂亞仆仂 从仍舒亟仆亠 舒于亳仍仂 仄仂亢亠 舒仂 亰仄仆ミ火委亳 舒于亳仍 仄仂亢亠 弍亳 亟亠从仍从舒 亳亰仆舒亠仆仆: 仗仂亠仆仆 从仂亟 从仍舒-从仍仆舒
  • 36. public interface ISpecification<T> { bool IsSatisfiedBy(T obj); } public class SurveyShouldBeImported : ISpecification<Survey> { public bool IsSatisfiedBy(Survey obj) { // ... } }
  • 37. 亠舒仍亰舒 仆从舒仗仍ム 弍仍亠于亠 弍亰仆亠-仗舒于亳仍仂 仂亢仍亳于 从仂仄仗仂亰亳仆 弌仗亠亳从舒 AndSpecification, OrSpecification, NotSpecification 仂亢仍亳于亠 仗仂亟仆舒仆仆 仂仄舒仆亟 舒 弌仗亠亳从舒亶
  • 38. public class AndSpecification<T> : ISpecification<T> { private readonly ISpecification<T> first; private readonly ISpecification<T> second; public AndSpecification(ISpecification<T> first, ISpecification<T> second) { this.first = first; this.second = second; } public bool IsSatisfiedBy(T obj) { return first.IsSatisfiedBy(obj) && second.IsSatisfiedBy(obj); } }
  • 40. 亳亰仆舒亠仆仆 仍舒亳-从仍仆亳 于亳从仂亳仂于ム 仗亠于仆亳亶 仆亠亠亶 仂弍仆亠 仗亠亠于仂亠仆仆 仆亠亠亶 仂亟仆仂亞仂 从仍舒 于 仆亠亠亶 仆仂亞仂 仍 于亳从仂亳舒仆仆 仆ム亳 从仍舒于 亟舒仗 仂亟亳仆 仆亠亠亶 亟仂 仆仂亞仂
  • 41. 亳从仍舒亟 public interface ISurveyRepository { IList<Survey> GetAll(); Survey Get(int id); }
  • 43. 亳亰仆舒亠仆仆 仄仆舒 仗仂于亠亟仆从亳 仂弍从舒 弍亠亰 亰仄仆亳 仆亠亠亶 仂亟舒仆仆 仆从仂仆舒仍仆仂 亟亳仆舒仄仆仂 亳从仍舒亟: 仂亟舒于舒仆仆 于舒仍亟舒
  • 44. public interface ISurveysImporter { void Import(); } public sealed class SurveysImporter : ISurveysImporter { ... public void Import() { // ... initialize import here fileImporterStrategy.Import(); // ... report completed successfully } }
  • 45. public sealed class SecurityCheckingSurveysImporter : ISurveysImporter { private readonly ISurveysImporter importer; public void Import() { if (GetCurrentUserRole() != "Admin") { throw new InvalidOperationException( "User is not allowed to import surveys."); } importer.Import(); } ...
  • 46. 亠舒仍亰舒 亠从仂舒仂 亠舒仍亰 仆亠亠亶 仗仂舒从仂于仂亞仂 仂弍从 亠从仂舒仂 亰弍亠亞舒 仗仂亳仍舒仆仆 仆舒 仗仂舒从仂于亳亶 仂弍从 仂舒从仂于亳亶 仂弍从 仆亠 亰仆舒 仗仂 亟仂亟舒从仂于 仆从仂仆舒仍仆 亠从仂舒仂亳 仄仂亢 仗仂亟仆于舒亳 仂仄仗仂亰亳 亰舒仄 仆舒仍亟于舒仆仆
  • 47. 亢亠 于亟仂仄 舒弍仍仂仆亳 Iterator IEnumerable<T> + IEnumerator<T> yield return -- 从仂仄仗仍仂 舒仄 亞亠仆亠 亠舒仂 Observer C# events, based on delegates Proxy 仂仗 亟仂 于亠弍-亠于于 MVC Repository