2010-02-16 5 views
1

У меня есть различные классы для обработки данных форм и запросов к базе данных. Мне нужен совет по сокращению количества кода, который я пишу с сайта на сайт.Статические методы vs Класс Экземпляры и возвращаемые значения в C#

Следующий код предназначен для обработки формы, отправленной через ajax на сервер. Это просто экземпляр класса Form, проверяет данные и обрабатывает ошибки:

public static string submit(Dictionary<string, string> d){ 

    Form f = new Form("myform"); 

    if (!f.validate(d)){ 

     return f.errors.toJSON(); 

    } 

    //process form... 

} 

Есть ли способ, чтобы уменьшить это до 1 строки следующим образом:

if (!Form.validate("myform", d)){ return Form.errors.toJSON(); } 
+8

Что случилось с его нынешней форме? Если вы одержимы тем, что делаете это на одной строке, поместите инструкцию 'if' сразу после точки с запятой. –

ответ

7

Давайте сломаем это на два вопроса.

1) Могу ли я написать существующую логику в одном утверждении?

Локальная переменная должна быть объявлена ​​в ее собственном заявлении, но инициализатор не обязательно должен быть там. Вполне законно сказать:

Form f; 
if (!(f=new Form("myform")).validate(d))return f.errors.toJSON(); 

Почему вы хотели бы быть вне меня; делать это уродливо, трудно отлаживать, трудно понять и трудно поддерживать. Но это совершенно законно.

2) Могу ли я сделать этот метод экземпляра статическим методом?

Возможно, не напрямую. Предположим, у вас было два абонента, проверяющих материал на двух разных потоках, оба вызывали статический метод Form.Validate и оба производили ошибки. Теперь у вас гонка. Один из них собирается выиграть и заполнить Form.Errors. И теперь у вас есть два потока, сообщающих один и тот же набор ошибок, но ошибки неверны для одного из них.

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

Errors errors = Validator.Validate(d); 
if (errors != null) return errors.toJSON(); 

Теперь код очень ясен, а реализация Validate проста. Создайте форму, вызовите валидатор, либо верните null, либо ошибки.

Я бы предположил, что вам не нужен совет по телефону , уменьшая количество кода, который вы пишете.Скорее, получите совет по , как сделать код более похожим на значение, которое он намеревается представлять. Иногда это означает, что нужно писать немного больше кода, но этот код ясен и понятен.

+0

Это гораздо лучший ответ, чем мое половинчатое предложение TLS. –

+0

Спасибо за ваш ответ. С тех пор я решил, что исходный код, вероятно, является лучшим решением для этого языка. – markvpc

3

Я хотел бы переместить все общую логику проверки к суперклассу.

Я думаю, что основная проблема вашего кода - это не то, что долго, но вы повторяете, что во многих местах, если вам удастся сделать его одним лайнером, это не будет СУХОЙ.

Посмотрите на шаблон Template Method, он может помочь здесь (абстрактным классом с валидацией будет шаблон, а ваши конкретные «действия» будут подклассами).

1

Конечно, вы могли бы написать это:

public static string FormValidate(Dictionary<string, string> d) 
{ 
    Form f = new Form("myform"); 
    if (!f.validate(d)) 
     return f.errors.ToJSON(); 

    return null; 
} 

, то ваш отправить может быть:

public static string submit(Dictionary<string, string> d) 
{ 
    if ((string errs = FormValidate(d))!= null) { return errs; } 
    // process form 
} 

Это сокращает свой код и не повредит читаемости вообще.

+0

Это сработает, но я бы не рекомендовал его. Если бы я просмотрел этот код, я бы отклонил этот метод. –

+0

Это просто заставляет работу валидации использовать в свой собственный метод. В этом нет ничего плохого, но мне не нравится, что он полностью монолитен тем, что он всегда использует класс Form, который не параметризуется из этого конкретного интерфейса. – plinth

Смежные вопросы