Станислав Сидристый «Шаблон lifetime: для сложного disposing»

30
Шаблон Lifetime: для сложного Disposing Станислав Сидристый

Upload: spbdotnet-community

Post on 21-Jan-2018

123 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Шаблон Lifetime: длясложного Disposing

Станислав Сидристый

Page 2: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Станислав СидристыйEpam Systems

Epam, Kaspersky, Luxoft, ...

Выступал на конференциях .NEXT, Apps4All Forum, CLRium #1,

#2, #3, QA: Conference и проч.

.NET via C#, CLI/C++, JS

Page 3: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

IDisposable

Page 4: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

public class Disposable : IDisposable{ bool _disposed;

public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }

protected virtual void Dispose(bool disposing) { if(disposing) { // освобождаем управляемые ресурсы } // освобождаем неуправляемые ресурсы }

protected void CheckDisposed() { if(_disposed) { throw new ObjectDisposedException(); } }

~Disposable() { Dispose(false); }}

Page 5: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

1. Основным плюсом шаблона является возможностьдетерминированного освобождения ресурсов: тогда,когда это необходимо

2. Введение общеизвестного способа узнать, чтоконкретный тип требует разрушения его экземпляров вконце использования

3. При грамотной реализации шаблона работаспроектированного типа станет безопасной

Page 6: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

1. Основным плюсом шаблона является возможностьдетерминированного освобождения ресурсов: тогда,когда это необходимо

2. Введение общеизвестного способа узнать, чтоконкретный тип требует разрушения его экземпляров вконце использования

3. При грамотной реализации шаблона работаспроектированного типа станет безопасной

Page 7: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

1. Основным плюсом шаблона является возможностьдетерменированного освобождения ресурсов: тогда,когда это необходимо

2. Введение общеизвестного способа узнать, чтоконкретный тип требует разрушения его экземпляров вконце использования

3. При грамотной реализации шаблона работаспроектированного типа станет безопасной

Page 8: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Минусы

Page 9: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Неявная публичная оферта

Page 10: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

CheckDisposed()

Page 11: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Необходимость интерфейсов наследовать IDisposable

Page 12: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Раздельное объявление сtor и Dispose()

Page 13: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Проблема использования шаблона на графах объектов, многослойной архитектуре

Page 14: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Lifetime

Page 15: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Dispose

Page 16: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Lifetime

Page 17: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Сервис

Page 18: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Page 19: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

public class Lifetime { public bool IsTerminated { get; }

public void Add(Action action);

// Statics public static Lifetime Etheral { get; }

public static LifetimeDef Define();

public static LifetimeDef DefineDependent(OuterLifetime parent);

public static Lifetime WhenAll(params OuterLifetime[] lifetimes);

public static Lifetime WhenAny(params OuterLifetime[] lifetimes); }

public struct OuterLifetime { public bool IsTerminated { get; }

public static implicit operator OuterLifetime(Lifetime lifetime);

public static implicit operator OuterLifetime(LifetimeDef lifetime); }

Page 20: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

public class LifetimeDef { public Lifetime Lifetime { get; }

public void Terminate(); }

Page 21: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Demo

Page 22: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Результаты

Page 23: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Явно указано, от чего зависит время жизниНеявная публичная оферта

Page 24: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Интерфейсы остаются чистыми

Необходимость интерфейсов наследовать IDisposable

Page 25: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Легко

Проблема использования шаблона на графах объектов, многослойной архитектуре

Page 26: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Слитное объявление регистрации и очисткиРаздельное объявление сtor и Dispose()

Page 27: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Только для объектов, имеющих явный LifetimeDefCheckDisposed()

Page 28: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Links

Text

https://www.youtube.com/watch?v=cfPEN5_6UtI

Page 29: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

Linkshttps://github.com/sidristij/dotnetbook/

Page 30: Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»

QA

github.com/[email protected]