Это открытый / закрытый принцип?А если нет - PullRequest
0 голосов
/ 25 мая 2011

Учитывая следующий код

public interface IEntity {
int Id { get; set; }
}

public class User : IEntity {
    public int Id { get; set; }
}

public abstract class RepositoryBase<TEntity> where TEntity : IEntity {

    public bool Save(TEntity entity) {
        if (!IsValid(entity)) return false;

        // Write to data store

        return true;
    }

    public abstract TEntity CreateNew();

    protected abstract bool IsValid(TEntity entity);
}


public class UserRepository : RepositoryBase<User> {

    public override User CreateNew() {
        return new User {
            Id = 3
        };
    }

    protected override IsValid(User entity) {
        return entity.Id > 0;
    }
}

Это принцип открытия / закрытия ? т.е. перенос большей части ответственности на базовый класс и предоставление определенных функциональных обязанностей наследованию классов.

Не похоже, что это так, если это не принцип открытого / закрытого типа, то что это за шаблон дизайна?

Приветствия

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Вы можете создавать новые репозитории для различных структур данных, расширяя RepositoryBase<TEntity> по-разному, без необходимости изменять код в RepositoryBase<TEntity>.Это основной смысл принципа открытого / закрытого.

При этом принцип открытого / закрытого является общим принципом проектирования, а не шаблоном проектирования.Основной шаблон проектирования, видимый в отношении методов Save и IsValid, представляет собой Шаблонный метод .

0 голосов
/ 13 апреля 2012

Как вы можете прочитать в википедии, у OCP есть пара определений. Тот, который, вероятно, в основном используется в stackoverflow, является полиморфным. Я предпочитаю защищенные варианты spin, поскольку в идеале мы хотим иметь дизайн, который допускает варианты в одном месте, которые не влияют на определенные (защищенные) классы, которые зависят от этих вариантов.

В вашем примере изменения в реализациях IEntity не повлияют на классы клиентов, которые используют IEntities, при условии, что у вас нет прямой связи между клиентами и реализациями. То есть клиенты должны знать только об IEntities, а не о конкретных реализациях. Это часто требует реализации фабрики, чтобы клиенты могли получить доступ к реализациям, не зная их конкретно.

...