2013-07-16 1 views
2

Отказ от ответственности: Этот вопрос задан как тот, кто рассмотрит совет Скотта Мейерса в пункте 23 Эффективного C++, который будет хорошим дизайном OO - по крайней мере, на C++.Предпочитаете функции non-member non-friend ... в Java?

В Java, где глобальных функций не существует, сначала может показаться, что этот принцип неприменим, но мне кажется, что это так. Соберите собственный пример Скотта Мейерса.

public class WebBrowser { 
    public void clearCache() {} 
    public void clearHistory() {} 
    public void removeCookies() {} 
} 

Пути создания ассоциированного «пространство имен» класс, содержащего удобный метод статического , я увеличил инкапсуляцию WebBrowser путем сведения к минимуму объема кода, который может получить доступ к его внутренности. В конце концов, статические методы в Java являются по существу глобальными функциями (предполагая, что все в классе является общедоступным и статическим).

public class WebBrowserStuff { 
    private WebBrowserStuff() {} // prevent instantiation 

    public static void clearBrowser(WebBrowser browser) { 
     browser.clearCache(); 
     browser.clearHistory(); 
     browser.clearRemoveCookies(); 
    } 
} 

Единственный недостаток я вижу в том, что нет ни одного аргумента, зависящих от поиска в Java, так что вызов метода является немного более многословным.

WebBrowserStuff.clearBrowser(browser); 

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

Я не интересно услышать личные мнения относительно того, или нет, как правило, хороший объектно-ориентированного дизайна, хотя я утра интересно услышать, есть ли какие-либо культурные различия между C++ и Java, которые могут вызвать общее мнение опираться так или иначе.

[EDIT]

К сожалению, я действительно не получить ответ на мой вопрос, мой редактировать, чтобы попытаться сделать его менее на основе мнений, не помешало ему быть закрыты, так что я не могу выберите принятый ответ. Можно было бы интерпретировать это как то, что на самом деле нет технической причины, по которой вы не хотели бы этого делать (предполагая, что это хорошая практика на C++), и любое противодействие этому методу является чисто личной или культурной Java-вещью.

+0

Эти классы называются классами помощников, и они часто встречаются, часто считаются плохой практикой. См. Http://blogs.msdn.com/b/nickmalik/archive/2005/09/06/461404.aspx –

ответ

1
WebBrowserStuff.clearBrowser(browser); 

статический метод, который определен в классе и непосредственно не имеют доступа к экземпляру сверх той, которая передается. Для этого требуется еще класс по соображениям удобства. Обычно в самих библиотеках Java это делается только тогда, когда мы либо работаем со специальным типом, который не может справиться со всеми этими статическими методами (Array объектов, противопоставленных утилитам в классе Arrays, или Collections, где мы работаем с широкий набор интерфейсов, которые не должны принимать статические методы.

Эти вспомогательные классы, как правило, не является хорошей практикой, и в вашем случае, вы можете, и должны, положить clearBrowser как нестатической метод WebBrowser.

Теперь это было сделано, и хотя это не совсем хорошая практика, это технически обоснованно, и нет договорных обязательств об отказе вам в этом праве.В этой заметке, чтобы встретиться с именами библиотек Java, я бы назвал вспомогательный класс WebBrowsers, поскольку библиотеки обычно рассматривают рассматриваемый класс/интерфейс и используют его для этого назначения.

+0

У вас есть причина, почему занятия не очень хороши на практике? Почему я должен ставить 'clearBrowser' как нестатический член' WebBrowser'? И я понимаю, что статические методы не связаны с экземпляром; это точка - они ведут себя как глобальные функции. Я не совсем уверен, что вы подразумеваете под требованием другого класса по соображениям удобства. Возможно, вы просто суммируете, что делает «WebBrowserStuff»? Спасибо, что указали классы массивов и коллекций; это хорошие примеры коллекций общих алгоритмов, которые хорошо вписываются в отдельный «статический» класс. –

+0

@JosephThomson 1. Это создает больше классов. 1 и 2) Обычно методы, работающие в состоянии экземпляра, должны быть в классе, а не в другом, поскольку он содержит семантический смысл в «clearBrowser этого браузера, а не clearBrowser с параметром». – hexafraction

0

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

+0

Что вы подразумеваете под «статическими методами по природе, исключенными из накладных расходов при инстанциях»? Это проблема производительности? «Сохранение вещей вместе» - главный аргумент в том, что все функции члена на C++ тоже есть, но я действительно не покупаю его (Meyers делает хороший аргумент в одной онлайн-статье). –

+0

Что я имею в виду, так это то, что статические методы не требуют дополнительных накладных расходов для каждого созданного экземпляра. Поэтому, если у вас одновременно работает 3000 веб-браузеров, вы не платите одинаковые накладные расходы за вызов на каждом из 3000, как если бы вы звонили в функции-члены. – RutledgePaulV

0

Нет, это не распространено в Java, и это не способ сделать это. WebBrowserStuff, который вы создали, выглядит на Java, как плохая реализация шаблона Singleton. Одна из проблем с вашей реализацией заключается в том, что вы можете создать несколько экземпляров WebBrowserStuff. Кажется, вам нужен только один, поэтому вы должны использовать Singleton.

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

Однако, если вы хотите сделать класс-помощник, обязательно сделайте его Singleton: добавьте частный конструктор, чтобы никто, кроме класса, не смог создать экземпляр и добавить метод getInstance() для получения экземпляра.

+0

Вы правы в том, что я должен сделать конструктор закрытым, но не так, чтобы только «WebBrowserStuff» мог создать экземпляр самого себя, скорее, чтобы ничто не могло сделать его экземпляр; 'WebBrowserStuff' не является синглом; это просто контейнер для множества статических методов и не имеет состояния, поэтому создание экземпляра 'WebBrowserStuff' не имеет смысла. –

+0

Джозеф, конечно, вы можете использовать статический класс. Я думал, что Синглтон лучше в этом случае. Проверьте это обсуждение Singleton vs Class со всеми статическими методами http://stackoverflow.com/questions/7329788/static-methods-or-singleton-which-one-to-choose. Я нахожу это очень полезным. Проверьте также способ Enum для реализации Singleton (начиная с Java 5). Я бы использовал весь класс статических методов, если действительно очень мало ресурсов (крошечное мобильное устройство?). Даже для вспомогательных методов таких классов, как Collections. Синглтоны обладают большей гибкостью. Приветствия. – chipay

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

  • Нет связанных вопросов^_^