Mikhail Valkov_Antipatterns

663 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
663
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Mikhail Valkov_Antipatterns

  1. 1. АНТИПАТЕРНЫ ПРОГРАММИРОВАНИЯ2011<br />Part 1<br />
  2. 2. <ul><li>What is patterns ?
  3. 3. Patterns for patterns
  4. 4. Target patterns
  5. 5.  Structural patterns
  6. 6. Creational patterns
  7. 7. Optimization example </li></li></ul><li><ul><li>Дубликаты кода
  8. 8. Большая вложенность внутри метода
  9. 9. Магические константы
  10. 10. Суперклассы, интерфейсы, методы
  11. 11. Public только для тестов</li></li></ul><li> Structural patterns<br /><ul><li>Proxy
  12. 12. Adapter
  13. 13. Facade
  14. 14. Bridge
  15. 15. Decorator
  16. 16. Composite</li></li></ul><li> Structural patterns<br />Proxy<br />Служит для управления доступом к заданному объекту, перехватывая вызовы к нему. Ни интерфейс ни функциональность замещенного компонента, для клиента, не должна изменяются.<br />Используется:<br /><ul><li>работа с объектом не должна зависеть от того, где он реально расположен</li></li></ul><li> Structural patterns<br />Adapter<br />Служит для приведения интерфейса объекта к требуемому виду.<br /><ul><li>существующий объект, называемый адаптируемым, предоставляет необходимые функции, но не поддерживает нужного интерфейса;
  17. 17. неизвестно заранее, с каким интерфейсами придется работать адаптируемому объекту;</li></li></ul><li> Structural patterns<br />Facade<br />Объединяет группу объектов в рамках одного специализированного интерфейса и переадресует вызовы его методов к этим объектам.<br />Используется:<br /><ul><li>упростить доступ к сложной системе;
  18. 18. создать различные уровни доступа к системе;</li></li></ul><li> Structural patterns<br />Bridge<br />Позволяет разделить объект на абстракцию и реализацию так, чтобы они могли изменяться независимо друг от друга.<br />Используется:<br /><ul><li>независимо изменять интерфейс работы с клиентом и реализацию;
  19. 19. выбирать реализацию в процессе работы программы;</li></li></ul><li> Structural patterns<br />Decorator<br />Декоратор предназначен для динамического добавления объекту новой функциональности. <br />Используется:<br /><ul><li>динамически и прозрачно для клиента изменять функциональность объекта;
  20. 20. реализовать небольшую функциональность, которая в дальнейшем может быть исключена;</li></li></ul><li> Structural patterns<br />Composite<br />Позволяет упростить и стандартизировать взаимодействие между клиентом и группой объектов, представляющих древовидную структуру или части составного объекта.<br />Используется:<br /><ul><li>представить группу объектов в виде "составной объект – его части";
  21. 21. для обращения как к составным объектам, так и к отдельным частям.</li></li></ul><li>Creational patterns<br /><ul><li>Singleton
  22. 22. Multiton
  23. 23. Object pool/Cache
  24. 24. Prototype
  25. 25. Builder</li></li></ul><li>Creational patterns<br />Singleton<br />Предоставляет доступ к объекту<br />public sealed class Singleton<br /> {<br />private static Singleton instance;<br />private Singleton() { }<br /> public static Singleton Instance<br />{<br />get { return instance??(instance = new Singleton()); }<br />}<br />}<br />
  26. 26. Creational patterns<br />Singleton<br />public class Singleton<T>where T: class<br />{<br /> private static readonlyLazy<T> instance = new Lazy<T>(<br /> () => (T)typeof(T).GetConstructor(BindingFlags.Instance |BindingFlags.NonPublic, null, new Type[0], null).Invoke(null));<br /> public static T Instance { <br />get {<br />return instance.Value; }<br />}<br />}<br />
  27. 27. Creational patterns<br />Multiton<br />Создаёт определенное число своих экземпляров и предоставляет точку доступа для работы с ними. Каждый экземпляр связан с уникальным идентификатором.<br />public sealed class Multiton<TKey><br />{<br />private static readonlyConcurrentDictionary<TKey,Multiton<TKey>>instances = new ConcurrentDictionary<TKey,Multiton<TKey>>();<br />private Multiton(TKey key) { /* ... */ }<br />public static Multiton<TKey> GetInstance(TKey key)<br />{<br />return instances.GetOrAdd(key, x => new Multiton<TKey>(x));<br />}<br />}<br />
  28. 28. Creational patterns<br />Object pool<br />Предназначен хранения готовых к использованию объектов. Когда системе требуется новый объект, он запрашивается из Пула, минуя процесс порождения. А после использования возвращается обратно в Пул вместо уничтожения.<br />Используется:<br /><ul><li>объекты часто создаются и уничтожаются;
  29. 29. создание/уничтожение объекта являются очень затратными операциями.</li></li></ul><li>Creational patterns<br />Object pool/Cache<br />public interface IPoolObjectCreator<out T><br />{<br />TCreate();<br />}<br />public class DefaultObjectCreator<T> :IPoolObjectCreator<T>where T : class, new()<br />{<br />TIPoolObjectCreator<T>.Create()<br />{<br />return new T();<br /> }<br />}<br />public class ObjectPool<T>where T : class, IPoolable<br />{<br />private readonlyConcurrentBag<T> container = new ConcurrentBag<T>();<br />}<br />
  30. 30. Creational patterns<br />Prototype<br />Позволяет создавать новые объекты путем клонирования уже существующих.<br />Используется:<br /><ul><li>система не должна зависеть от способа создания и реализации входящих в нее объектов;
  31. 31. класс порождаемого объекта определяется в момент выполнения;</li></ul>public abstract class SimpleElement<br />{<br />public uintId { get; set; }<br /> public string Title { get; set; }<br /> public virtual SimpleElementClone()<br /> {<br />return (SimpleElement)this.MemberwiseClone();<br /> }<br />}<br />
  32. 32. Creational patterns<br />Prototype<br />public abstract class SimpleElement<br />{<br />public GuidId { get; set; }<br /> public string Title { get; set; }<br /> public virtual SimpleElementClone()<br /> {<br />return (SimpleElement)this.MemberwiseClone();<br /> }<br />}<br />public void CopyObjects(IEnumerable<SimpleElement> selectedElements)<br />{<br />foreach(SimpleElementelementin selectedElements)<br />{<br />SimpleElementnewElement = element.Clone();<br />newElement.Id = Guid.NewGuid();<br />this.AddNewElement(newElement);<br />}<br />}<br />
  33. 33. Creational patterns<br />Builder<br />Позволяет отделить процесс создания сложного объекта от его реализации. При этом, результатом одних и тех же операций могут быть различные объекты.<br />Используется:<br /><ul><li>алгоритм этого процесса не должен зависеть от того, из каких частей состоит объект;
  34. 34. конструирование должно обеспечивать возможность создавать различные объекты.</li></li></ul><li>Factory Method<br />Применяется для создания объектов с определенным интерфейсом или абстрактным классом, реализации которого предоставляются потомкам.<br />
  35. 35. Factory Method<br />РЕАЛИЗАЦИЯ<br />publicinterfaceIDataStorage<br />{<br />voidSave(Streamstream); <br /> StreamLoad(); <br />}<br /> <br />publicabstractclassDocumentManager<br />{<br /> publicabstractIDataStorageCreateStorage();<br />}<br /> <br />publicclassFileStorageManager: DocumentManager<br />{<br />privateclassFileStorage : IDataStorage{/* … */}<br /> <br />publicoverrideIDataStorage CreateStorage() <br /> { <br />returnnewFileStorage(); <br /> } <br />} <br />publicclassMemeoryStorageManager : DocumentManager<br />{<br />privateclassMemeoryStorage : IDataStorage {/* … */}<br />publicoverrideIDataStorageCreateStorage() <br /> { <br />returnnewMemeoryStorage(); <br /> } <br />}<br /> <br />
  36. 36. Factory Method<br />использование<br />public enum StorageFormat<br />{<br />File,<br />Memory<br />}<br />static void Main(string[]args)<br />{<br />IDataStorage storage=CreateStorage(StorageFormat.Memory);<br />storage.Load();<br />}<br />static IDataStorage CreateStorage(StorageFormat format)<br />{<br />switch (format)<br />{<br />case StorageFormat.Memory:<br />return new FileStorageManager().CreateStorage();<br />case StorageFormat.File:<br />return new MemeoryStorageManager().CreateStorage();<br />default:<br />throw new ArgumentException("Invalid format: " + format);<br /> }<br />}<br /> <br />
  37. 37. Factory Method<br />к чему это приводит<br />public enum StorageFormat<br />{<br />File,<br /> /*<br /> . . . <br /> */<br />Memory<br />}<br />static void Main(string[]args)<br />{<br />IDataStorage storage=CreateStorage(StorageFormat.Memory);<br />storage.Load();<br />}<br />static IDataStorage CreateStorage(StorageFormat format)<br />{<br />switch (format)<br />{<br />case StorageFormat.Memory:<br />return new FileStorageManager().CreateStorage();<br /> /*<br /> . . . <br /> */<br />case StorageFormat.File:<br />return new MemeoryStorageManager().CreateStorage();<br />default:<br />throw new ArgumentException("Invalid format: " + format);<br /> }<br />}<br /> <br />
  38. 38. Factory Method<br />пример решения<br />private delegate IDataStorage MakeStorageHandler();<br />private static readonly IDictionary<StorageFormat, MakeStorageHandler> storageMaker =<br />new Dictionary<StorageFormat, MakeStorageHandler><br /> {<br />{ StorageFormat.File, () => new FileStorageManager().CreateStorage() },<br />{ StorageFormat.Memory, () => new MemeoryStorageManager().CreateStorage() }<br /> };<br />static IDataStorage CreateStorage(StorageFormat format)<br />{<br /> if (storageMaker.ContainsKey(format))<br />{<br /> return storageMaker[format]();<br />}<br /> throw new ArgumentException("Invalid format: " + format);<br />}<br /> <br />
  39. 39. Factory Method<br />работа с ключом<br />public enumStyleType<br />{<br />[StringValue("Grid")]<br />Grid,<br />[StringValue("Grid View")]<br />GridView,<br />[StringValue("Grid List")]<br />GridList,<br />}<br />public static string GetStringValue(this Enum@enum)<br />{<br /> Type type = @enum.GetType();<br />MemberInfo[] memberInfo = type.GetMember(@enum.ToString());<br />if (!memberInfo.IsNullOrEmpty())<br />{<br /> object[] attributes = memberInfo[0].GetCustomAttributes(typeof(StringValueAttribute),false);<br /> if (!attributes.IsNullOrEmpty())<br /> {<br /> return ((StringValueAttribute)attributes[0]).Value;<br />}<br /> }<br />return @enum.ToString();<br />}<br /> <br />

×