Лично, у меня почти никогда нет потребности записать абстрактные классы.
Большинство раз я вижу, что абстрактные классы используемый (mis), это - потому что автор абстрактного класса использует "Шаблонный шаблон" метода.
проблема с "Шаблонным методом" состоит в том, что это почти всегда несколько повторно используемо - "полученный" класс знает о не только "абстрактный" метод его базового класса, который это реализует, но также и об открытых методах базового класса, даже при том, что большинство раз это не должно называть их.
(Чрезмерно упрощенный) пример:
abstract class QuickSorter
{
public void Sort(object[] items)
{
// implementation code that somewhere along the way calls:
bool less = compare(x,y);
// ... more implementation code
}
abstract bool compare(object lhs, object rhs);
}
, Таким образом, здесь, автор этого класса записал универсальный алгоритм и предназначает, чтобы люди использовали его путем "специализации" его путем обеспечения их собственных "рычагов" - в этом случае, "сравнить" метод.
, Таким образом, намеченное использование - что-то вроде этого:
class NameSorter : QuickSorter
{
public bool compare(object lhs, object rhs)
{
// etc.
}
}
проблема с этим состоит в том, что Вы незаконно связали вместе два понятия:
В вышеупомянутом коде, теоретически, авторе "сравнить" метода может повторно используемо , перезванивают в суперкласс метод "Вида"... даже при том, что в практике они никогда не будут хотеть или должны сделать это.
цена, которую Вы платите за эту ненужную связь, - то, что трудно изменить суперкласс, и на большинстве языков OO, невозможных изменить его во времени выполнения.
альтернативный метод должен использовать шаблон разработки "Стратегии" вместо этого:
interface IComparator
{
bool compare(object lhs, object rhs);
}
class QuickSorter
{
private readonly IComparator comparator;
public QuickSorter(IComparator comparator)
{
this.comparator = comparator;
}
public void Sort(object[] items)
{
// usual code but call comparator.Compare();
}
}
class NameComparator : IComparator
{
bool compare(object lhs, object rhs)
{
// same code as before;
}
}
Так замечают теперь: Все, что мы имеем, является интерфейсами и конкретными реализациями тех интерфейсов. В практике Вам действительно не нужно ничто больше, чтобы сделать дизайн OO высокого уровня.
Для "скрытия" того, что мы реализовали "сортировку имен" при помощи класса "QuickSort" и "NameComparator" мы могли бы все еще записать метод фабрики где-нибудь:
ISorter CreateNameSorter()
{
return new QuickSorter(new NameComparator());
}
Любой время у Вас есть абстрактный класс, можно сделать это..., даже когда существуют естественные повторно используемые отношения между основой и производным классом, это обычно платит для создания их явными.
Одна последняя мысль: Все, что мы сделали выше, "составляют" функцию "NameSorting" при помощи функции "QuickSort" и функции "NameComparison"... на языке функционального программирования, этот стиль программирования становится еще более естественным с меньшим количеством кода.
Самая важная особенность IDE для разработки Perl (включая Padre):
интерактивный отладчик, который действительно работает . Например, запоминание точек останова, возможность углубляться в сложные структуры данных и копирование (в буфер обмена) должны работать с наблюдаемыми переменными - включая команду меню Copy Special, которая позволяет помещать их в различные форматы; скажем, CSV, XML или разделенные табуляцией.
Политики окончания строк для файлов, по каталогам и по проекту.
Итак, для данного проекта или каталога я хотел бы сделать все окончания строк только LF. Находясь в другом каталоге, я, возможно, захочу иметь смесь файлов CRLF и LF.
Я много работаю над вещами, которые перемещаются между средами Unix и Win32.
Типичное решение автоматического преобразования всех файлов обратно и движение вперед с платформы на платформу не сработало для меня.
Когда файл случайно создается в неправильном формате, это может быть настоящей болью.
Интеграция цикла чтения-оценки-печати. Как активный пользователь Emacs, я очень ценю Sepia . Очень полезно, чтобы опробовать что-то перед тем, как закрепить его за кодом.
Возможность настройки и запуска внешних (командной строки) инструментов. Плагины великолепны, но конечные пользователи не обязательно захотят создавать их только для интеграции с внешним инструментом. Разрешение пользователям настраивать свои собственные инструменты обеспечивает большую расширяемость с минимальными барьерами для входа.
Мой любимый редактор - UltraEdit. Это не IDE, но благодаря поддержке пользовательских инструментов я смог интегрировать такие функции IDE, как lint, контроль версий, отладка и многое другое.
Рефакторинг в стиле Visual-Studio для переменных и имен функций и извлечение функций. Visual Studio выполняет поиск всех ссылок во всем модуле и позволяет увидеть все измененные строки, если вы не хотите изменять один экземпляр (по какой-либо причине) ....
Менеджер проекта. Для меня очень важно уметь определять набор файлов и папок, составляющих конкретную кодовую базу. Сеансы полезны, но не заменяют их.
Стабильность. Люди быстро отворачиваются, если их редактор выходит из строя и теряет работу.
Хорошая интеграция VCS . Это то, что мне очень нравится в Eclipse: вы сразу видите, какие файлы имеют локальные изменения, а какие еще не добавлены в репозиторий. И вы можете просматривать различные версии и иметь красивый обзор различий всего одним щелчком мыши.
Первое, что я ищу, это какой-то обзор текущего активного файла. Я хотел бы увидеть методы / функции и, если возможно, модули use'd и, особенно, любые операторы use'd.
Вы довольно хорошо решили это в Padre.
Я много пользуюсь Perl EPIC , и моя самая большая проблема - не возможность перейти к функции, которая четко определена в текущий контекст (обычно при нажатии F3). Симпатично много удач или промахов на данный момент.
Хорошо, вот мой третий ответ, хотя мне неприятно это говорить.
Конкурс довольно прост в установке. Падре нет. Я попробовал обновиться до последней версии сегодня и снова получил неудачные тесты.
Две самые бесценные особенности, которые я нахожу:
Тестирование интеграции.
Perl имеет отличные инструменты для модульного тестирования. Когда я запускаю свой набор тестов и получаю ошибку, я хочу увидеть код для теста, который не прошел.
Хороший способ пролистать результаты тестов и увидеть код неудавшегося теста вместе с ожидаемыми и фактическими результатами было бы большим благом.
Этого можно добиться с помощью use strict
; но также может быть полезной функцией, даже если не использовать
'd явно, а именно:
на днях мы потратили около 10-20 минут на отладку следующего поведения:
my %hash;
$hash->{'key1'} = value1;
# on reading in different module
print $hash{'key1'}; # is of course empty, but was so easy to overlook in the code above
возобновить: надлежащая безопасность типов Perl, обеспечиваемая IDE.
Это могло быть уже реализовано в Padre, хотя, как оказалось, не в Eclipse + EPIC
Это выполняется неопределенно, но было бы легко добавить счетчик цикла в предложение while
var solved = false;
var tries = 0;
while (!solved)
{
try
{
//Do Something
solved = true;
}
catch
{
//Fix error
}
finally
{
if(solved || IsRediculous(tries))
break;
tries++;
}
}
-121--2768677- Да, довольно часто существует цикл с несколькими повторными попытками, когда вы вырываетесь из цикла при успехе. Несколько вещей:
Вы можете добавить задержку перед повторением, чтобы не использовать все повторные попытки всего за несколько миллисекунд, прежде чем временная проблема успеет исправиться.
Если вы в конечном итоге потерпите неудачу, вы должны бросить первое исключение, которое вы поймали, а не последнее. Второе исключение может быть результатом неуспешного восстановления после первого сбоя и может не помочь в отладке исходной проблемы.
-121--2768683-Возможность использовать свой собственный выбор редактора (который он может иметь, насколько я знаю). Это имеет шанс выиграть над vim/emacs людей.
Я не знаю, умеет ли Padre это делать, но возможность разделения экрана очень важна для меня. Как пользователь VIM я постоянно разделяю экран, чтобы посмотреть на другой файл во время кодирования.
Я работаю с Komodo. Я также использую другие редакторы, но чаще всего возвращаюсь к Komodo. Хорошая IDE должна иметь: