Вот пример того, как Вы могли бы сделать это в Python, понятия подобны на любом языке.
>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
if item not in skip:
try:
results[item] += 1
except KeyError:
results[item] = 1
>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...
первая строка просто получает библиотеки, которые помогают с частями проблемы, как во второй строке, где загрузки urllib2 копия Словаря "дьявола Ambrose Bierce" следующие строки входят в список всех слов в тексте без пунктуации. Тогда Вы создаете хэш-таблицу, которая в этом случае похожа на список уникальных слов, связанных с числом. Для цикла пробегается через каждое слово в книге Bierce, если уже существует запись того слова в таблице, каждое новое возникновение добавляет тот к значению, связанному с тем словом в таблице; если слово еще не появилось, оно добавляется к таблице со значением 1 (значение одного возникновения.) Для случаев Вы говорите о, Вы хотели бы уделить намного больше внимания деталям, например, с помощью капитализации, чтобы помочь определить имена собственные только посреди предложений, и т.д., это очень грубо, но выражает понятие.
Для вхождения в материал стемминга и плюрализации, эксперимент, затем изучают стороннюю работу, я наслаждался частями NLTK, который является академическим проектом с открытым исходным кодом, также в Python.
class Application {
protected static $_singletonFoo=NULL;
public static function foo() {
if(NULL === self::$_singletonFoo) {
self::$_singletonFoo = new Foo;
}
return self::$_singletonFoo;
}
}
Я бы так и поступил. Он создает объект по запросу:
Application::foo()->bar();
Я так и делаю, он соблюдает принципы ООП, это меньше кода, чем то, что вы делаете прямо сейчас, и объект создается только тогда, когда он нужен коду в первую очередь время.
Примечание : то, что я представил, даже не является настоящим одноэлементным шаблоном. Синглтон допускает только один экземпляр самого себя, определяя конструктор (Foo :: __ constructor ()) как закрытый. Это только «глобальная» переменная, доступная для всех экземпляров «Приложения». Вот почему я думаю, что его использование правильно, поскольку оно НЕ игнорирует хорошие принципы ООП. Конечно, как и все остальное в мире, этим «шаблоном» тоже не следует злоупотреблять!
Я видел, как он используется во многих фреймворках PHP, в том числе в Zend Framework и Yii. И вы должны использовать фреймворк. Я не собираюсь говорить вам, какой именно.
Приложение Для тех из вас, кто беспокоится о TDD , вы все равно можете сделать некоторую проводку для внедрения зависимостей. Это может выглядеть так:
class Application {
protected static $_singletonFoo=NULL;
protected static $_helperName = 'Foo';
public static function setDefaultHelperName($helperName='Foo') {
if(is_string($helperName)) {
self::$_helperName = $helperName;
}
elseif(is_object($helperName)) {
self::$_singletonFoo = $helperName;
}
else {
return FALSE;
}
return TRUE;
}
public static function foo() {
if(NULL === self::$_singletonFoo) {
self::$_singletonFoo = new self::$_helperName;
}
return self::$_singletonFoo;
}
}
Здесь достаточно возможностей для улучшения. Это просто PoC, используйте ваше воображение.
Почему это так? Что ж, в большинстве случаев приложение не будет проходить модульное тестирование, оно будет запускаться , надеюсь, в производственной среде . Сила PHP - в его скорости. PHP НЕ является и никогда не будет «чистым языком ООП», как Java.
В приложении есть только один класс Application и не более одного экземпляра каждого из его помощников (согласно ленивой загрузке, как указано выше). Конечно, синглтоны - это плохо, но опять же, только если они не соответствуют реальному миру. В моем примере это так.
Стереотипные "правила" вроде "
Вы также можете заставить включенный файл возвращать результат, а не печатать его. Затем вы можете использовать его в переменной, как и во втором примере.
<?php
return 'Hello world.';
?>
test.php
<?php
return 'Hello World';
?>
<?php
$t = include('test.php');
echo $t;
?>
Пока во включенном файле есть оператор возврата, он будет работать.
$test = file_get_contents('test.php');
echo $test; //Outputs "Hello world.";