SlideShare a Scribd company logo
1 of 25
АНТИПАТЕРНЫ ПРОГРАММИРОВАНИЯ2011 Part 1
[object Object]
Patterns for patterns
Target patterns
 Structural patterns
Creational patterns
Optimization example ,[object Object]
Большая вложенность внутри метода
Магические константы
Суперклассы, интерфейсы, методы
Public только для тестов,[object Object]
Adapter
Facade
Bridge
Decorator
Composite,[object Object],[object Object]
неизвестно заранее, с каким интерфейсами придется работать адаптируемому объекту;,[object Object]
создать различные уровни доступа к системе;,[object Object]
выбирать реализацию в процессе работы программы;,[object Object]
реализовать небольшую функциональность, которая в дальнейшем может быть исключена;,[object Object]
для обращения как к составным объектам, так и к отдельным частям.,[object Object]
Multiton
Object pool/Cache
Prototype
Builder,[object Object]

More Related Content

What's hot

Kirill Zotin клиент серверное взаимодействие под android в деталях
Kirill Zotin клиент серверное взаимодействие под android в деталяхKirill Zotin клиент серверное взаимодействие под android в деталях
Kirill Zotin клиент серверное взаимодействие под android в деталяхDneprCiklumEvents
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7Technopark
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collectionsMERA_school
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхKirill Zotin
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Javametaform
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classesMERA_school
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода выводаmetaform
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 

What's hot (14)

Kirill Zotin клиент серверное взаимодействие под android в деталях
Kirill Zotin клиент серверное взаимодействие под android в деталяхKirill Zotin клиент серверное взаимодействие под android в деталях
Kirill Zotin клиент серверное взаимодействие под android в деталях
 
JRebel
JRebelJRebel
JRebel
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7
 
Bytecode
BytecodeBytecode
Bytecode
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталях
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода вывода
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 

Viewers also liked

Aleksey_Demedetskiy_Jenkins
Aleksey_Demedetskiy_JenkinsAleksey_Demedetskiy_Jenkins
Aleksey_Demedetskiy_JenkinsCiklum
 
Move Accumulation To Collecting Parameter
Move Accumulation To Collecting ParameterMove Accumulation To Collecting Parameter
Move Accumulation To Collecting Parametermelbournepatterns
 
Speakers' corner_Kharkov
Speakers' corner_KharkovSpeakers' corner_Kharkov
Speakers' corner_KharkovCiklum
 
CiklumNETSat10122011:DmitriyMindra-DCI
CiklumNETSat10122011:DmitriyMindra-DCICiklumNETSat10122011:DmitriyMindra-DCI
CiklumNETSat10122011:DmitriyMindra-DCICiklum
 
Speakers' corner
Speakers' cornerSpeakers' corner
Speakers' cornerCiklum
 
Pavel_Kravchenko_Mobile Development
Pavel_Kravchenko_Mobile DevelopmentPavel_Kravchenko_Mobile Development
Pavel_Kravchenko_Mobile DevelopmentCiklum
 
Anders Sorensen_Optimizing development in an offshore context
Anders Sorensen_Optimizing development in an offshore contextAnders Sorensen_Optimizing development in an offshore context
Anders Sorensen_Optimizing development in an offshore contextCiklum
 
Dmitriy Pasko_NuGet - package management for .NET
Dmitriy Pasko_NuGet - package management for .NETDmitriy Pasko_NuGet - package management for .NET
Dmitriy Pasko_NuGet - package management for .NETCiklum
 

Viewers also liked (9)

Aleksey_Demedetskiy_Jenkins
Aleksey_Demedetskiy_JenkinsAleksey_Demedetskiy_Jenkins
Aleksey_Demedetskiy_Jenkins
 
Move Accumulation To Collecting Parameter
Move Accumulation To Collecting ParameterMove Accumulation To Collecting Parameter
Move Accumulation To Collecting Parameter
 
Speakers' corner_Kharkov
Speakers' corner_KharkovSpeakers' corner_Kharkov
Speakers' corner_Kharkov
 
CiklumNETSat10122011:DmitriyMindra-DCI
CiklumNETSat10122011:DmitriyMindra-DCICiklumNETSat10122011:DmitriyMindra-DCI
CiklumNETSat10122011:DmitriyMindra-DCI
 
Speakers' corner
Speakers' cornerSpeakers' corner
Speakers' corner
 
Pavel_Kravchenko_Mobile Development
Pavel_Kravchenko_Mobile DevelopmentPavel_Kravchenko_Mobile Development
Pavel_Kravchenko_Mobile Development
 
Anders Sorensen_Optimizing development in an offshore context
Anders Sorensen_Optimizing development in an offshore contextAnders Sorensen_Optimizing development in an offshore context
Anders Sorensen_Optimizing development in an offshore context
 
Dmitriy Pasko_NuGet - package management for .NET
Dmitriy Pasko_NuGet - package management for .NETDmitriy Pasko_NuGet - package management for .NET
Dmitriy Pasko_NuGet - package management for .NET
 
запахи кода
запахи кодазапахи кода
запахи кода
 

Similar to Mikhail Valkov_Antipatterns

паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.Igor Shkulipa
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9Technopark
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.Igor Shkulipa
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2Dev
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0akrakovetsky
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Dima Dzuba
 
Java осень 2012 лекция 8
Java осень 2012 лекция 8Java осень 2012 лекция 8
Java осень 2012 лекция 8Technopark
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011etyumentcev
 
CPU Performance in Java.
CPU Performance in Java.CPU Performance in Java.
CPU Performance in Java.Dzmitry Hil
 
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Fedor Malyshkin
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.Igor Shkulipa
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9Technopark
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.Igor Shkulipa
 

Similar to Mikhail Valkov_Antipatterns (20)

паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9
 
Java осень 2012 лекция 8
Java осень 2012 лекция 8Java осень 2012 лекция 8
Java осень 2012 лекция 8
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011
 
CPU Performance in Java.
CPU Performance in Java.CPU Performance in Java.
CPU Performance in Java.
 
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 

Mikhail Valkov_Antipatterns

  • 2.
  • 7.
  • 11.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 25.
  • 26. Creational patterns Singleton public class Singleton<T>where T: class { private static readonlyLazy<T> instance = new Lazy<T>( () => (T)typeof(T).GetConstructor(BindingFlags.Instance |BindingFlags.NonPublic, null, new Type[0], null).Invoke(null)); public static T Instance { get { return instance.Value; } } }
  • 27. Creational patterns Multiton Создаёт определенное число своих экземпляров и предоставляет точку доступа для работы с ними. Каждый экземпляр связан с уникальным идентификатором. public sealed class Multiton<TKey> { private static readonlyConcurrentDictionary<TKey,Multiton<TKey>>instances = new ConcurrentDictionary<TKey,Multiton<TKey>>(); private Multiton(TKey key) { /* ... */ } public static Multiton<TKey> GetInstance(TKey key) { return instances.GetOrAdd(key, x => new Multiton<TKey>(x)); } }
  • 28.
  • 29.
  • 30.
  • 31. класс порождаемого объекта определяется в момент выполнения;public abstract class SimpleElement { public uintId { get; set; } public string Title { get; set; } public virtual SimpleElementClone() { return (SimpleElement)this.MemberwiseClone(); } }
  • 32. Creational patterns Prototype public abstract class SimpleElement { public GuidId { get; set; } public string Title { get; set; } public virtual SimpleElementClone() { return (SimpleElement)this.MemberwiseClone(); } } public void CopyObjects(IEnumerable<SimpleElement> selectedElements) { foreach(SimpleElementelementin selectedElements) { SimpleElementnewElement = element.Clone(); newElement.Id = Guid.NewGuid(); this.AddNewElement(newElement); } }
  • 33.
  • 34.
  • 35. Factory Method РЕАЛИЗАЦИЯ publicinterfaceIDataStorage { voidSave(Streamstream);  StreamLoad(); }   publicabstractclassDocumentManager { publicabstractIDataStorageCreateStorage(); }   publicclassFileStorageManager: DocumentManager { privateclassFileStorage : IDataStorage{/* … */}   publicoverrideIDataStorage CreateStorage() { returnnewFileStorage(); } } publicclassMemeoryStorageManager : DocumentManager { privateclassMemeoryStorage : IDataStorage {/* … */} publicoverrideIDataStorageCreateStorage() { returnnewMemeoryStorage(); } }  
  • 36. Factory Method использование public enum StorageFormat { File, Memory } static void Main(string[]args) { IDataStorage storage=CreateStorage(StorageFormat.Memory); storage.Load(); } static IDataStorage CreateStorage(StorageFormat format) { switch (format) { case StorageFormat.Memory: return new FileStorageManager().CreateStorage(); case StorageFormat.File: return new MemeoryStorageManager().CreateStorage(); default: throw new ArgumentException("Invalid format: " + format); } }  
  • 37. Factory Method к чему это приводит public enum StorageFormat { File, /* . . . */ Memory } static void Main(string[]args) { IDataStorage storage=CreateStorage(StorageFormat.Memory); storage.Load(); } static IDataStorage CreateStorage(StorageFormat format) { switch (format) { case StorageFormat.Memory: return new FileStorageManager().CreateStorage(); /* . . . */ case StorageFormat.File: return new MemeoryStorageManager().CreateStorage(); default: throw new ArgumentException("Invalid format: " + format); } }  
  • 38. Factory Method пример решения private delegate IDataStorage MakeStorageHandler(); private static readonly IDictionary<StorageFormat, MakeStorageHandler> storageMaker = new Dictionary<StorageFormat, MakeStorageHandler> { { StorageFormat.File, () => new FileStorageManager().CreateStorage() }, { StorageFormat.Memory, () => new MemeoryStorageManager().CreateStorage() } }; static IDataStorage CreateStorage(StorageFormat format) { if (storageMaker.ContainsKey(format)) { return storageMaker[format](); } throw new ArgumentException("Invalid format: " + format); }  
  • 39. Factory Method работа с ключом public enumStyleType { [StringValue("Grid")] Grid, [StringValue("Grid View")] GridView, [StringValue("Grid List")] GridList, } public static string GetStringValue(this Enum@enum) { Type type = @enum.GetType(); MemberInfo[] memberInfo = type.GetMember(@enum.ToString()); if (!memberInfo.IsNullOrEmpty()) { object[] attributes = memberInfo[0].GetCustomAttributes(typeof(StringValueAttribute),false); if (!attributes.IsNullOrEmpty()) { return ((StringValueAttribute)attributes[0]).Value; } } return @enum.ToString(); }