Я перепроектирую часть нашего внутреннего инструмента ORM и хочу предоставить Field (класс, представляющий поле в базе данных, например CustomerFirstName) непосредственно конечному разработчику.
Так что это было достаточно просто сделать, однако API стал немного уродливым, потому что этот класс Field ранее использовался внутренне и слишком открыт. Например, и это только один небольшой пример: свойство IsDirty было не только для чтения, и это то, что конечные разработчики не должны иметь возможность вмешиваться.
Я подумал о том, чтобы создать два интерфейса, IPublicField и IPrivateField, и попытаться заставить полевой класс реализовать их оба. Однако, продолжая пример IsDirty, я не хотел что-то вроде этого:
Public ReadOnly Property PrivateIsDirty Implements IPrivateField.IsDirty
...
End Property
Public Property IsDirty Implements IPublicField.IsDirty
...
End Property
... Это немного уродливо, плюс вы все равно можете вернуться к классу Field и войти в метод non-readonly. Я также не хотел вводить отдельный метод установки, потому что это было бы еще одно критическое изменение, о котором я не хочу думать, и это также привело бы к несоответствию с другими частями API.
В итоге я переименовал класс Field в InnerField и создал вокруг него структуру стиля фасада / обертки следующим образом:
Public Class Field
Implements BusinessObjects.IField
Private InnerField As BusinessObjects.IInnerField
Public Sub New(ByVal field As IInnerField)
InnerField = field
End Sub
...
Public ReadOnly Property IsDirty() As Boolean Implements BusinessObjects.IField.IsDirty
Get
Return InnerField.IsDirty
End Get
End Property
...
End Class
Кажется, это работает очень хорошо. Внутренне InnerField достаточно открыт, и у нас есть свобода сделать его более открытым в будущем, не влияя на конечных разработчиков, а внешне класс Field предоставляет упрощенный, закрытый инструмент, который нужен конечным разработчикам.
Итак, предполагая, что это было логично, мне было интересно, как вы могли поступить в этой ситуации и кажется ли мое решение разумным со стороны.
Спасибо!