Как устранить нулевые аргументы без лишних кодов - PullRequest
1 голос
/ 26 октября 2011

Например:

getBooks(author, title)
  • Если разрешить автору быть нулевым, будут возвращены все книги с определенным названием
  • Если заголовок будет пустым, будут возвращены все книги для конкретного автора
  • Если разрешить оба значения быть нулевыми, будут возвращены все книги независимо от названия или автора

Чтобы устранить это, выполните следующие функции:

getBooks(author) 
getBooks(title)  
getBooks(author, title)  
getBooks()

В новых функциях могут быть избыточные коды или, если мы сгруппируем эти избыточные коды в функцию, мы все равно попадем в функцию с нулевыми параметрами. Какой лучший способ справиться с этим - без избыточного кода и нулевых параметров?

Ответы [ 4 ]

7 голосов
/ 26 октября 2011

Не перегружайте столько:

getBooksByAuthor(author) 
getBooksByTitle(title)  
getBooksByAuthorAndTitle(author, title)  
getBooks()

Обратите внимание, что это не уменьшит повторное использование кода: эти методы могут повторно использовать / совместно использовать любой код, который им необходим в их реализациях

0 голосов
/ 26 октября 2011

Предполагая, что автор и заголовок являются строками, вы можете сделать следующее:

public List getBooks(String params ...) {
    if (params.length == 0) { //search 
     //do search all books regardless of title or author
    } else if (params.length == 2 && "cte_author".equals(params[1])) {
     //do search  by author
    } else if (params.length == 2 && "cte_title".equals(params[1])) {
     //do search by title
    } else if (params.length == 2){
     //do search by title and book
    } else {
     //throw exception
    }
}

Таким образом, вы можете использовать этот метод следующим образом:

getBooks();
getBooks("Gabriel Garcia Marquez", "cte_author");
getBooks("Cien anios de soledad", "cte_title");
getBooks("Gabriel Garcia Marquez","Cien anios de soledad");
0 голосов
/ 26 октября 2011

Вы можете использовать константу для обозначения того, какой тип поиска выполнять, и проверить, был ли передан параметр (очень непроверенный и проверен на наличие ошибок):

public static final int R_AUTH = 1;
public static final int R_BOOK = 2;
public static final int R_ALL = 3;

public bookSearch( int searchType, String... search )
{
    switch( searchType )
    {
        case R_AUTH:
          // search based off of (String)search[0].stringValue();
        break;
        case R_ALL:
          // load all
        break;
    }
}

bookSearch(R_ALL);
bookSearch(R_AUTH, "Poe");
0 голосов
/ 26 октября 2011

Попробуйте этот подход:

getAllBooks()            {return getBooks("", "");}
getBooksByAuthor(author) {return getBooks(author, "");}
getBooksByTitle(title)   {return getBooks("", title);}
getBooksByAuthorAndTitle(author, title)
{
    if(author.equals("") && title.equals(""))
    {
        return //your book list
    }
    else if(author.equals(""))
    {
        return //a list of books with the given title
    }
    else if(title.equals(""))
    {
        return //a list of books with given author
    }
    else
    {
        return //a list of books with the given title and author
    }
}

Редактировать : Обновлено для устранения неопределенности.

...