Ищете некоторые общие отзывы относительно моего дизайна сервера ESP. относительно использования универсального метода - PullRequest
0 голосов
/ 02 февраля 2011

Этот вопрос является продолжением моего предыдущего поста здесь .Мартиньо попросил меня предоставить больше информации о моей системе.У него есть предположение, что может быть лучший способ добиться того, что я пытаюсь сделать.Итак, если есть вопрос здесь, я думаю, мне интересно, если это плохой дизайн?Если так, что можно улучшить и как (лучше всего я учусь на иллюстрациях).Спасибо.

Я работаю над промежуточным программным обеспечением для приложения iPhone.

Вместо того, чтобы явно вызывать различные объекты из клиента, разработчики хотят использовать обобщенные элементы, где «Группа» возвращает строку JSON на основе переданного параметра.Параметр представляет собой первый экран, который пользователь видит при входе в систему. Мы называем экран входа в систему «приборной панелью».

Итак, когда клиент вызывает метод сервера:

 Contracts.GroupDto IDashboardService.GetGroupById(string groupId)
        {
            var obj = GroupRepository.GetGroupById(groupId);

            return new Contracts.GroupDto
            {
                ...
            };
        }

Сервер использует метод GroupRepository GetGroupById для возврата универсального типа объекта:

public static IList<G> GetGroupById<G>(int groupId)
        {

            DashboardGroupType type = (DashboardGroupType)groupId;
            IList<G> result = new List<G>();

            var obj = default(G);

            switch (type)
            {
                case DashboardGroupType.Countries:
                    break;
                case DashboardGroupType.Customers:
                    // this returns a list of typ  IEnumerable<Customer>
                    obj = (G) CustomerRepository.GetAllCustomers();
                    break;
                case DashboardGroupType.Facilities:
                    // this returns a list of typ  IEnumerable<Facility>
                    obj = (G) FacilityRepository.GetAllFacilities();
                    break;
                case DashboardGroupType.Heiarchy:
                    break;
                case DashboardGroupType.Lines:
                    break;
                case DashboardGroupType.Regions:
                    // this returns a list of typ  IEnumerable<string>
                    obj = (G) CustomerRepository.GetRegionsHavingCustomers();
                    break;
                case DashboardGroupType.States:
                    // // this returns a list of typ  IEnumerable<Customer>
                    obj = (G) CustomerRepository.GetStatesHavingCustomers();
                    break;
                case DashboardGroupType.Tanks:
                    break;
                default:
                    break;
            }

            result.Add(obj);


            return result;

        }

ОбъектВозвращаемый тип основан на параметре, переданном в GetGroupById.Например, если значение равно 1, метод просматривает перечисление DashboardGroupType:

и передает параметр 1, сервер просматривает следующее перечисление:

 public enum DashboardGroupType
    {
        Countries = 0,
        Regions = 1,
        Customers = 2,
        Facilities = 3,
        Lines = 4,
        Tanks = 5,
        States = 6,
        Heiarchy = 7
    }

и возвращаетсписок регионов типа IEnumerable для вызывающего клиента.

Есть ли какие-либо мысли относительно этого дизайна (особенно относительно метода IList GetGroupById (int groupId)? Если у вас есть предложения, я был бы признателен за иллюстрацию вашего улучшения.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Этот код не имеет большого смысла для меня.Ваш универсальный возвращает IList<G>, но в список добавлен только один элемент.И иногда этот элемент равен null (или default<G>, который будет null, когда G является ссылочным типом).

Я не могу представить, почему разработчики предпочтут GetGroupByIdуниверсальный метод при этом более сложен, чем наличие отдельных методов.То есть, почему бы не иметь GetFacilities, GetCustomers и т. Д.?

Возможно, они предпочитают иметь единственный метод службы, который возвращает им JSON.Если для этого есть веская причина (хотя я не могу себе представить такую, кроме лени разработчика), я бы посоветовал вам выполнить switch в этом методе и не связываться с общим.То есть:

Contracts.GroupDto IDashboardService.GetGroupById(string groupId)
{
    switch ((DashboardGroupType)groupId)
    {
        case DashboardGroupType.Regions:
            // Get the Regions list, convert to JSON, and return.
            break;
        // do the same kind of thing for the other group types.
    }
}

Добавление универсального метода в этом случае является просто ненужной сложностью - оно ничего не делает для упрощения или улучшения понимания кода.Наоборот, это усложняет понимание кода.

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

0 голосов
/ 03 февраля 2011

Не используйте оператор switch. Это может привести к ошибкам и трудно поддерживать. Я предлагаю вам создать базовый класс (абстрактный) с поведением по умолчанию для GetGroupById () и получить классы для каждой из групп DashboardGroupType. Enum уместен, когда вам просто нужно сохранить как переменную / свойство, и вам не нужно выполнять какую-либо логику, основанную на значении. В ваших производных классах вы можете переопределить поведение по умолчанию или оставить его по умолчанию (вернуть ноль). Вы также можете подумать об использовании шаблона проектирования пустых объектов.

Вы по достоинству оцените дизайн, когда появятся какие-то изменения, и изменение является единственной константой:)

Вы можете обратиться к книге Мартина Фаулера "Рефакторинг"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...