Как Вы решаете, пользоваться ли библиотекой или записать Вашу собственную реализацию

Почему бы не записать прототип в допустимом (X) HTML во-первых? Я имею никогда , нашел что быть большим количеством усилия, чем использование недопустимого HTML. Создание допустимого XHTML должно быть тривиальной задачей. (С другой стороны, производя семантически значимый XHTML мог бы быть более налоговым.)

Короче говоря, я вижу никакое преимущество безотносительно в использовании недопустимого HTML для прототипов.

17
задан 3 revs, 2 users 65% 23 May 2017 в 12:24
поделиться

5 ответов

Общее решение

Прежде чем решать, что использовать, я создам список критериев, которым должна соответствовать библиотека. Это может включать размер, простоту, точки интеграции, скорость, сложность проблемы, зависимости, внешние ограничения и лицензию. В зависимости от ситуации факторы, участвующие в принятии решения, будут различаться.

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

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

Сложность

Если задача относительно проста (например, класс MultiValueMap), то:

  1. Найдите существующую реализацию с открытым исходным кодом.
  2. Интегрируйте код.
  3. Перепишите его или урежьте. вниз, если оно чрезмерно.

Если задача сложная (например, гибкая объектно-ориентированная графическая библиотека), то:

  1. Найдите реализацию с открытым исходным кодом, которая компилируется (из коробки).
  2. Выполните его "Hello, world!" эквивалент.
  3. При необходимости выполните любые другие оценки.
  4. Определите ее пригодность на основе критериев проблемной области.

Скорость

Если библиотека слишком медленная, то:

  1. Профилируйте ее.
  2. Оптимизируйте его.
  3. Отправьте результаты обратно сообществу.

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

API

Если API не простой, то:

  • Напишите фасад и внесите его обратно в сообщество.
  • Или найдите более простой API.

Размер

Если скомпилированная библиотека слишком велика, то:

  • Скомпилируйте только необходимые исходные файлы.
  • Или найдите библиотеку меньшего размера.

Ошибки

Если библиотека не компилируется из коробки, ищите альтернативы.

Зависимости

Если библиотека зависит от множества внешних библиотек, ищите альтернативы.

Документация

Если документации недостаточно (например, руководств пользователя, руководства по установке, примеры, комментарии к исходному коду), ищите альтернативы.

Ограничения по времени

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

Среда разработки

Если библиотека привязана к определенной среде разработки, ищите альтернативы.

Лицензия

Открытый исходный код .

18
ответ дан 30 November 2019 в 12:20
поделиться

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

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

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

1
ответ дан 30 November 2019 в 12:20
поделиться

Если это тривиальная функция, не стоит втягивать всю библиотеку.

Если это нетривиальная функция, то она того стоит.

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

4
ответ дан 30 November 2019 в 12:20
поделиться

10 вопросов ...

+++ (использовать библиотеку) ... --- (написать собственную библиотеку)

  1. Библиотека - это именно то, что мне нужно? Настраивается за несколько шагов? +++
  2. Предоставляет ли он почти все функции? Легко расширяемый? +++
  3. Нет времени? +++
  4. Одному тайму хорошо, а другому хорошо играть? ++
  5. Трудно расширить, но отличная документация? ++
  6. Трудно расширить, но большая часть функциональности? +
  7. Функционал в норме, но устарел? -
  8. Функциональность в порядке, .. но странно (сумасшедший интерфейс, ненадежный, ...)? -
  9. Библиотека работает, но человек, которому нужно определиться, находится в состоянии hybris? ---
  10. Библиотека работает, размер кода управляем, портфолио нужно обновить? ---

Некоторые мысли ...

Если это что-то маленькое, но полезное, вероятно, и для других, тогда зачем писать библиотеку и размещать ее в сети. Стоимость публикации таких небольших библиотек снизилась, а также стало препятствием для других пользователей (см. bitbucket или github ). Итак, каковы критерии?

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

* / fun

6
ответ дан 30 November 2019 в 12:20
поделиться

Значит, вы хотите избежать циклов?

Вот он:

public static String repeat(String s, int times) {
    if (times <= 0) return "";
    else return s + repeat(s, times-1);
}

(конечно, я знаю, что это уродливо и неэффективно, но в нем нет циклов :-p)

Хотите попроще и красивее? используйте jython:

s * 3

Edit : давайте немного оптимизируем его :-D

public static String repeat(String s, int times) {
   if (times <= 0) return "";
   else if (times % 2 == 0) return repeat(s+s, times/2);
   else return s + repeat(s+s, times/2);
}

Edit2 : Я провел быстрый и грязный тест для 4 основных альтернатив, но у меня нет времени запустить его несколько раз, чтобы получить средства и построить график времени для нескольких входов ... Итак, вот код, если кто-то хочет его попробовать:

public class Repeat {
    public static void main(String[] args)  {
        int n = Integer.parseInt(args[0]);
        String s = args[1];
        int l = s.length();
        long start, end;

        start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            if(repeatLog2(s,i).length()!=i*l) throw new RuntimeException();
        }
        end = System.currentTimeMillis();
        System.out.println("RecLog2Concat: " + (end-start) + "ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            if(repeatR(s,i).length()!=i*l) throw new RuntimeException();
        }               
        end = System.currentTimeMillis();
        System.out.println("RecLinConcat: " + (end-start) + "ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            if(repeatIc(s,i).length()!=i*l) throw new RuntimeException();
        }
        end = System.currentTimeMillis();
        System.out.println("IterConcat: " + (end-start) + "ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            if(repeatSb(s,i).length()!=i*l) throw new RuntimeException();
        }
        end = System.currentTimeMillis();
        System.out.println("IterStrB: " + (end-start) + "ms");
    }

    public static String repeatLog2(String s, int times) {
        if (times <= 0) {
            return "";
        }
        else if (times % 2 == 0) {
            return repeatLog2(s+s, times/2);
        }
        else {
           return s + repeatLog2(s+s, times/2);
        }
    }

    public static String repeatR(String s, int times) {
        if (times <= 0) {
            return "";
        }
        else {
            return s + repeatR(s, times-1);
        }
    }

    public static String repeatIc(String s, int times) {
        String tmp = "";
        for (int i = 0; i < times; i++) {
            tmp += s;
        }
        return tmp;
    }

    public static String repeatSb(String s, int n) {
        final StringBuilder sb = new StringBuilder();
        for(int i = 0; i < n; i++) {
            sb.append(s);
        }
        return sb.toString();
    }
}

Он принимает 2 аргумента, первый - это количество итераций (каждая функция запускается с repeat times arg from 1..n), а второй - это строка, которую нужно повторить.

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

Если у вас есть время и вы находите это интересным, напишите его. Вы многому научитесь на этом пути и сможете вернуть сообществу разработчиков ПО с открытым исходным кодом новый потрясающий набор кода. Если нет, то не надо. Но если вы не можете ее найти, вам все равно придется ее написать;)

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

Вы многому научитесь на этом пути и сможете вернуть сообществу разработчиков ПО с открытым исходным кодом новый потрясающий набор кода. Если нет, то не надо. Но если вы не можете ее найти, вам все равно придется ее написать;)

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

Вы многому научитесь на этом пути и сможете вернуть сообществу разработчиков ПО с открытым исходным кодом новый потрясающий набор кода. Если нет, то не надо. Но если вы не можете ее найти, вам все равно придется ее написать;)

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

1
ответ дан 30 November 2019 в 12:20
поделиться
Другие вопросы по тегам:

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