Куда поместить потенциально переприменимые функции помощника?

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

А более квалифицированный ответ отмечает что, если функция принимает аргументы переменной (особенно printf() семья функций), то прототип должен быть в объеме, чтобы быть строго совместимыми стандартами. Это верно для C89 (от ANSI) и C90 (от ISO; то же как C89 за исключением нумерации раздела). Кроме функций 'varargs', тем не менее, функционирует, каким возвратом int не должны быть объявлены, и функции, которые возвращаются, чему-то другому, чем int действительно нужно объявление, которое показывает, что возврат вводит, но не нуждается в прототипе для списка аргументов.

Примечание, однако, что, если функция берет аргументы, которые подвергаются 'нормальным продвижениям' в отсутствие прототипов (например, функция, которая берет char или short - оба из которых преобразовываются в int; более серьезно, возможно, функция, которая берет float вместо double), тогда прототип необходим. Стандарт был слаб об этом, чтобы позволить старому коду C компилировать в соответствии со стандартными совместимыми компиляторами; более старый код не был записан для волнения об обеспечении, что функции были объявлены перед использованием - и по определению, более старый код не использовал прототипы, так как они не стали доступными в C, пока не был стандарт.

C99 запрещает 'неявный интервал'..., который означает оба чудных случая как' static a;' (int по умолчанию) и также объявления неявной функции. Они упоминаются (наряду с приблизительно 50 другими существенными изменениями) в предисловии к ISO/IEC 9899:1999, который сравнивает тот стандарт с предыдущими версиями:

  • удаляют неявный int
    , †¦
  • удаляют объявление

неявной функции В ISO/IEC 9899:1990, В§6.3.2.2 , Вызовы функции указали:

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

extern int identifier();

появился. <глоток> 38

<глоток> 38 таким образом, идентификатор с областью действия блока, которая, как объявляют, имела внешнюю связь с типом, функционирует без информации о параметре и возврата int. Если на самом деле это не определяется, поскольку имеющий тип “function возврат int, ” поведение не определено.

Этот абзац отсутствует в стандарте 1999 года. Я еще не отследил изменение в формулировке, которая позволяет static a; в C90 и запрещает его (требование static int a;) в C99.

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

6
задан Nick Heiner 27 September 2009 в 20:12
поделиться

8 ответов

Вот одно решение:

Переместите метод, определяющий максимальное значение в двумерном массиве int, в открытый класс с именем IntUtils и поместите этот класс в пакет util.

Поместите метод, который возвращает вхождения символа в String, в puclic класс под названием StringUtils и поместите класс в пакет util.

Нет ничего особенно плохого в написании статических вспомогательных классов в Java. Но убедитесь, что вы не изобретаете велосипед; методы, которые вы только что описали, могут уже присутствовать в какой-либо библиотеке ОС, например Jakarta Commons .

5
ответ дан 16 December 2019 в 21:43
поделиться

Подождите, пока он вам не понадобится!

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

Когда вы будете готовы, в Eclipse «Extract Method».


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

3
ответ дан 16 December 2019 в 21:43
поделиться

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

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

Например, в вашем случае у меня было бы что-то вроде: General / ArrayUtils.java, и в этом случае я бы выбрал вашу функцию и любую другую нужную вам функцию.

Не волнуйтесь , что пока это создает новый класс (и пакет) только для одной функции. Как вы сказали в вопросе, это будет то, что вы будете использовать в следующем проекте, а затем и в следующем. Со временем этот «Генерал»

0
ответ дан 16 December 2019 в 21:43
поделиться

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

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

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

0
ответ дан 16 December 2019 в 21:43
поделиться

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

1
ответ дан 16 December 2019 в 21:43
поделиться

Я не знаю, что делают другие языки, но у меня есть голос опыта в Java по этому поводу: просто перейдите к скобке вашего класса и напишите, что вам нужно (или вложенный класс, если вы предпочитаете, поскольку это общепринятое каноническое соглашение в Java)

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

См. Другие комментарии о вложенных классах с одинаковым именем, если разные классы имеют одинаковую функциональность во вложенном классе с тем же именем. Что произойдет с более крупными базами кода, так это то, что они со временем разойдутся и создадут проблемы с ремонтопригодностью, которые уступят место Java Name of class как типу соглашения о типе классов, которое заставит вас каким-то образом решить проблему.

Что еще я мог сделать?

Будьте осторожны, не поддавайтесь порывам новичка. Ваш 1-2 удара прибивает его, сопротивляйтесь искушению.

0
ответ дан 16 December 2019 в 21:43
поделиться

Если бы это был я, я бы либо:

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

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

1
ответ дан 16 December 2019 в 21:43
поделиться

Вариант 2, вероятно, лучший вариант для Java, несмотря на то, что он вас не устраивает. Java неудовлетворительна, поэтому неудивительно.

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

-2
ответ дан 16 December 2019 в 21:43
поделиться
Другие вопросы по тегам:

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