четверг, 30 октября 2014 г.

Самокритика. Об УЖАСНЫХ интерфейсах

Собственно вот:

 Im3IndexedStorage = interface(IStorage)
  {* Хранилище с возможностью доступа по индексу. }
   ['{1962E532-4615-4D4A-9FAC-0F1E3402F097}']
   function SetIndexParam(aBits: byte;
    aMaxBits: byte): Boolean;
     {* устанавливает параметры "размазывания" индекса. }
   function DeleteStore(anIndex: Integer): hResult;
     {* удаляет элемент хранилища. }
   function CreateStore(anIndex: Integer;
    anAccess: Tm3StoreAccess;
    aStoreType: Tm3StoreType;
    out aStore: IUnknown;
    aUseCompression: Boolean = true): hResult; overload; 
     {* создает элемент хранилища. }
   function OpenStore(anIndex: Integer;
    anAccess: Tm3StoreAccess;
    aStoreType: Tm3StoreType;
    out aStore: IUnknown;
    aUseCompression: Boolean = true): hResult; overload; 
     {* открывает элемент хранилища. }
   function CreateStore(const aName: Tl3PCharLen;
    anAccess: Tm3StoreAccess;
    aStoreType: Tm3StoreType;
    out aStore: IUnknown;
    aUseCompression: Boolean = true): hResult; overload; 
     {* создает элемент хранилища }
   function OpenStore(const aName: Tl3PCharLen;
    anAccess: Tm3StoreAccess;
    aStoreType: Tm3StoreType;
    out aStore: IUnknown;
    aUseCompression: Boolean = true): hResult; overload; 
     {* открывает элемент хранилища }
   function OpenStore(aPosition: Int64;
    anAccess: Tm3StoreAccess;
    const aName: Tl3PCharLen;
    aStoreType: Tm3StoreType;
    aUseCompression: Boolean = true): IUnknown; overload; 
     {* открывает элемент хранилища. }
   function OpenStore(aPosition: Int64;
    anAccess: Tm3StoreAccess;
    anIndex: Integer;
    aStoreType: Tm3StoreType;
    aUseCompression: Boolean = true): IUnknown; overload; 
     {* открывает элемент хранилища }
   function OpenStore(const aStoreInfo: Tm3StoreInfo;
    const aName: Tl3PCharLen;
    anAccess: Tm3StoreAccess = m3_saRead;
    aUseCompression: Boolean = true): IUnknown; overload; 
     {* открывает элемент хранилища. }
   procedure Iterate(anAction: Tm3StorageElementAction); overload; 
     {* перебирает элементы хранилища по именам. }
   procedure Iterate(anAction: Tm3StoreAction); overload; 
     {* перебирает элементы хранилища по индексам. }
   procedure IterateF(anAction: Tm3StorageElementAction); overload; 
     {* перебирает элементы хранилища, потом освобождает заглушку. }
   procedure IterateF(anAction: Tm3StoreAction); overload; 
     {* перебирает элементы хранилища, потом освобождает заглушку. }
   function RenameElementA(const aOldName: Tl3WString;
    const aNewName: Tl3WString): hResult;
     {* Переименовывает элемент хранилища }
   function ElementExists(const aName: Tl3WString): Boolean;
     {* Проверяет существование элемента с указанным именем }
 end;//Im3IndexedStorage

Такие "интерфейсы" делать - НЕЛЬЗЯ.

Множество схожих методов с одинаковыми названиями.

Не говоря уж о том, что "одни через другие выводятся".

Я кстати долго думал - как "интерфейсы минимизировать". Через утилитные классы.

Если кому-то интересно - расскажу.

Если не интересно - "оставлю для себя".

Часть вещей были сделаны "в угоду оптимизации", но это всё равно - не является "оправданием".

Полный код тут - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/RealWork/m3/m3StorageInterfaces.pas

P.S. Переделал я кстати этот "интерфейс".Получше. Скоро напишу - как.

Комментариев нет:

Отправить комментарий