Как вы по-разному программируете на динамических языках?

Очень простой способ - использовать службу $filter и функцию в области, которая делегирует правильному фильтру:

angular.module('forecastDirective', [])
.directive('forecast', ['appConfig', function(appConfig) {
    return {
        templateUrl: appConfig.directivesRoot + 'templates/forecast.html',
        replace: true,
        scope: {
            weatherObject: "=",
            convertToDate: "&",
            filterTemp: "@",
            dateFormat: "@",
        },
        controller: ['$filter', '$scope', function($filter, $scope) {
            $scope.filterFn = function(in) {
                return $filter($scope.filterTemp)(in);
            };
        }
    }
}]);

Недостатком является то, что вы больше не можете использовать его как filter:

    
Daytime temperature: {{ filterFn(weatherObject.temp.day) }}

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


Вы можете реализовать мета-фильтр:

angular.module(...)
    .filter('metafilter', ['$filter', function($filter) {
        return function(input, filterName) {
            return $filter(filterName)(input);
        };
    }]);

Используйте его как:

    
Daytime temperature: {{ weatherObject.temp.day | metafilter:filterTemp }}

Это скрипка, демонстрирующая метафильтр: https://jsfiddle.net/opL1zfzd/

30
задан John D. Cook 9 April 2009 в 03:17
поделиться

15 ответов

Я думаю наиболее резкое различие в выборе структур данных.

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

В Perl я буду просто использовать хеш и 'изобретать' ключи, поскольку я кодирую.

2
ответ дан slim 9 April 2009 в 03:17
поделиться
  • 1
    Как проверить мои собственные классы dex' s длятся измененную дату в моем собственном application' s код Java? И что хуже, я нахожу, что classes.dex не обновляется, когда я восстанавливаю свое приложение. – FallingRain 30 September 2011 в 08:35

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

, Если я знаю то, что я хочу сделать, и обычно как сделать это, мне нравится C++. Если я не знаю, как сделать то, что я хочу сделать, и вероятно не совсем уверено в том, что я хочу сделать, я очень предпочитаю Lisp.

2
ответ дан David Thornley 9 April 2009 в 03:17
поделиться
  • 1
    Большое спасибо Ваш совет так valueable. ^_^ I' проверяю метод с помощью PackageInfo.lastUpdateTime... – FallingRain 30 September 2011 в 08:07

Динамические языки способны к выполнению кода, который был создан во времени выполнения. Это очень опасно, если вредоносный код введен. Но очень мощный, если можно санировать среду.

я думаю, что люди JavaScript делают это путем выполнения файлов JSON.

0
ответ дан 9 April 2009 в 03:17
поделиться
  • 1
    Спасибо, я долгое время искал что-то настолько легкое – Seltsam 1 March 2017 в 16:30

Одним путем я обычно использую в своих интересах языки динамического программирования, находится в упрощении и разъяснении синтаксиса. Если я представляю базу данных, например, синтаксис, который я использую для взаимодействия с нею, может быть намного более чистым, если я могу динамично загрузить свойства и методы на объекте базы данных для его таблиц, таблиц и строк для их столбцов, и так далее. Различие могло бы быть между:

$row = $db->getTable('user')->getRow(27);
$row->setValue('name', 'Bob');

и

$row = $db->user->getRow(27);
$row->name = 'Bob';

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

4
ответ дан chaos 9 April 2009 в 03:17
поделиться
  • 1
    Теперь я вижу, я не могу использовать PackageInfo.lastUpdateTime, потому что он зависит от цели handset' s время. каждый раз apk установлен или обновлен, PackageInfo.lastUpdateTime будет обновлением путем чтения end-user' s местное время. И какая потребность является apk' s созданное время. Так, я думаю, что должен использовать ДАТА макрос в собственном коде. – FallingRain 30 September 2011 в 09:04

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

Остерегаются программирования перестановкой, как бы то ни было. Мое персональное эмпирическое правило - то, что это просто, потому что это работает, не означает, что это готово, когда можно объяснить, почему это работает, это готово.

2
ответ дан J.T. Hurley 9 April 2009 в 03:17
поделиться
  • 1
    С Gradle 2.2.1 точный код выше возвращает 30.11.1979 12:00 для classes.dex (и все другие файлы в APK). Кто-либо находит время для этой проблемы?Править: Проигнорировать. Согласно комментарию ниже этого проблема, как упомянуто здесь: code.google.com/p/android/issues/detail?id=220039 – Gautam 19 October 2016 в 13:40

Больше библиотек и более важный [еще 110] применимые библиотеки .

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

1
ответ дан nimrodm 9 April 2009 в 03:17
поделиться
  • 1
    Да, теперь я использую его также приблизительно в диалоговом окне:) – Pointer Null 30 September 2011 в 19:51

Мои самые большие усиления находятся в отображении между базами данных и объектами (ORM).

, Если нет никакого понятия типа, становится очень легко сказать, присваивают каждый столбец подряд значению в объекте. Конечно, компромисс - то, что может быть несоответствие между типом значения, Вы думаете, там и что вводит компьютер, делает.

2
ответ дан Nick Van Brunt 9 April 2009 в 03:17
поделиться
  • 1
    Хм, я просто получил NullPointerException с помощью этого отрывка сегодня после переключающегося Studio Android для использования Мгновенного Выполнения. При создании с Мгновенным Выполнением ZipFile, полученный из ApplicationInfo, не содержит " классы dex" запись, вызывая NPE. Я переключился на " AndroidManifest.xml" и это, кажется, решило вопрос в моем проекте. – Damien Diehl 15 January 2016 в 01:54

Динамические Языки могут изменить объект во время выполнения, можно добавить методы, свойства...

Одним хорошим примером Динамического волшебства Языков является этот фрагмент кода Groovy, которые называют метод на веб-сервисе во всего двух строках кода:

def proxy = new SoapClient("http://localhost:6980/MathServiceInterface?wsdl");
def result = proxy.add(1.0, 2.0);

Это - другой отрывок Groovy, которые извлекают данные из XML:

def contacts = new XmlParser().parseText("<contacts><name>Bahaa Zaid</name></contacts>");
def myName = contacts.name[0].text();

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

3
ответ дан Bahaa Zaid 9 April 2009 в 14:17
поделиться
  • 1
    PackageInfo.lastUpdate не является работами для меня, вызовите его значение, всегда " 2000-01-01". – FallingRain 30 September 2011 в 19:46

У меня нет конкретного ответа, просто предложение: взгляните на книгу " Шаблоны проектирования в Ruby ": он охватывает большинство классических шаблонов проектирования (как Gamma и др. и т. д.) и довольно кратко выражает их в Ruby :)

1
ответ дан 28 November 2019 в 00:19
поделиться

Мне нравится ответ Слима. Я провожу сумасшедшее количество времени в Java и C ++, создавая собственные структуры данных, которые просто бесплатны в Python / Ruby. И создание специализированных функций для обработки этих пользовательских структур данных. Да, в C ++ STL действительно хорош. Да, Дженерики в Java хороши. Они помогают создавать пользовательские структуры данных гораздо быстрее, однако они все еще требуют много размышлений и размышлений.

Однако есть более фундаментальная причина, по которой с динамическими языками легче работать. Это глубокая идея, которая называется «Утиная печать». Некоторые комментарии выше относятся к типу утки, но, пожалуйста, уделите время тому, чтобы подумать о том, что такое утка. Это принципиально другой способ взглянуть на мир. Представление, несовместимое с такими языками, как Java и C ++.

Утиная типизация означает, что вы не тратите время на определение утки. Не имея необходимости формально определять свои объекты, вы экономите много времени и энергии. Получить правильные определения сложно. Взгляните на мой пост в блоге, где я привожу примеры: Формальные определения менее полезны, чем вы думаете

Утиная печать оказалась чрезвычайно полезной. Принцип «Обязательно игнорировать» в XML сделал XML таким значительным и полезным в Интернете. Но это просто пример утки.

Еще один способ выразить утки - это веб-мантра «Будь строг в том, что ты посылаешь, щедро в том, что ты принимаешь». Это также очень фундаментальная идея.

Наконец, Вы можете вернуться к моему длинному посту в блоге, где я объясняю типизацию утки и ее связь с такими вещами, как искусственный интеллект и моделирование: Типирование утки, искусственный интеллект и философия

9
ответ дан Daniel Lemire 28 November 2019 в 00:19
поделиться

Это сводится к одному из моих любимых соотношений: как много времени я провожу, размышляя о решении проблемы, по сравнению с тем, сколько времени я размышляю об инструменте, который я использую для решения проблемы. Думайте об этом как о эквиваленте S / N.

2
ответ дан dkretz 28 November 2019 в 00:19
поделиться

Джон, судя по вашему обновлению от 5 января 2009 г., вы можете найти AMOP интересным прочтите и многое другое в той строке, о которой вы думаете. Он довольно шепелявый, но, в конце концов, многие из хороших динамических идей родились именно там. Так что, если вы можете насладиться этим аспектом (или забыть о нем), авторы действительно обсуждают динамические аспекты, которые необходимы и используются для чего-то подобного. Это довольно мощная штука.

1
ответ дан 28 November 2019 в 00:19
поделиться

Для меня это скорость поворота. Динамические языки, которые я использую (на данный момент Python и немного JavaScript), интерпретируются. Это означает, что я могу пробовать что-то на лету. Если я хочу увидеть, как ведет себя определенная часть API, я могу просто взломать интерпретатор на пару минут.

Если бы я хотел сделать то же самое на языке вроде C #, мне бы пришлось запустить VS, создать проект, а затем скомпилировать его. Если я хочу протестировать часть более крупного программного обеспечения, над которым я работаю, мне, вероятно, придется его скомпилировать, что может занять много времени. К счастью, в .Net я могу загружать сборки из большого проекта в IronPython и получать некоторые из тех же преимуществ (например, быстрое тестирование различных частей API) интерпретируемых языков.

0
ответ дан 28 November 2019 в 00:19
поделиться

Я не могу процитировать это прямо сейчас (моя память меня подводит), но я слышал что-то вроде:

Ближе всего индустрия программирования подошла к серебряному пуля управляемые языки - освобождение программиста от необходимости беспокоиться о детали управления памятью и позволяя им сосредоточить больше энергии

Итак, я могу предположить, что это не столько то, что вы программируете иначе , сколько то, что вы можете посвятить больше своего мозга «решению проблемы», а чем детали реализации решения.

2
ответ дан 28 November 2019 в 00:19
поделиться

Прочтите "Perl высшего порядка" Марка Джейсона Доминуса. В нем обсуждается только Perl, но он дает методы, естественные для Perl, которые были бы менее естественными для большинства статических языков.

All languages obviously have their strengths and weaknesses and dymanic vs static 

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

1
ответ дан 28 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: