Абстракция - это большая тема, которую было бы сложно быстро охватить. Тем не менее, ваша программа - это один длинный метод, который, без сомнения, может быть переработан в более объектно-ориентированный дизайн.
Что касается упрощения вашего кода, есть много возможностей. Я начал с просмотра кода, который повторяется.
Выражение if
может состоять из нескольких частей, поэтому:
if (numberFirst > 3) {
System.out.println("You can't do that. Please start over.");
System.out.close();
}
if (numberFirst < 2) {
System.out.println("You can't do that. Please start over.");
System.out.close();
}
можно упростить до:
if ((numberFirst > 3) || (numberFirst < 2)) {
System.out.println("You can't do that. Please start over.");
System.out.close();
}
Если операторы могут быть вложенными, то:
[ 112]можно упростить до:
if (numberFirst == 3) {
if (operation.equals("1"))
System.out.println("You are using addition." + " Your answer is " + (num1 num2 + num3) + ".");
if (operation.equals("2"))
System.out.println("You are using subtraction." + " Your answer is " + (num1 - num2 - num3) + ".");
...
}
Я мог бы продолжать. Лучше всего изучать основные функции языка Java, например. циклы, switch
операторы, массивы и так далее. Тогда вы сможете упростить еще больше.
Я предпочитаю синтаксис пути, поскольку он делает это очень ясным, какому пространству имен или модулю заголовочный файл принадлежит.
#include "Physics/Solver.h"
очень самоописывает, не требуя, чтобы каждый модуль снабдил префиксом их имя к заголовочным файлам.
я почти никогда не использую ".." синтаксис, хотя, вместо этого у меня есть свой проект, включает, определяют корректные основные местоположения.
Проблема с #include "../include/header.h"
состоит в том, что это будет часто работать случайно, и затем на вид несвязанное изменение заставит его прекратить работать позже.
, Например, рассмотрите следующее исходное расположение:
./include/header.h
./lib/library.c
./lib/feature/feature.c
И скажем, что Вы запускаете компилятор с включать путем -I. -I./lib
. Что происходит?
./lib/library.c
может сделать #include "../include/header.h"
, который имеет смысл. ./lib/feature/feature.c
может также сделать #include "../include/header.h"
, даже при том, что это не имеет смысла. Это вызвано тем, что компилятор попробует #include
директива относительно местоположения текущего файла, и если это перестанет работать, то это попробует #include
директива относительно каждого -I
запись в эти #include
путь. , Кроме того, если Вы позже удаляете -I./lib
из эти #include
путь, тогда Вы повреждаетесь ./lib/feature/feature.c
.
я нахожу, что что-то как следующее предпочтительно:
./projectname/include/header.h
./projectname/lib/library.c
./projectname/lib/feature/feature.c
я не добавил бы, что любой включает записи пути кроме [1 115], и затем и library.c
и feature.c
использовал бы #include "projectname/include/header.h"
. Предполагая, что "projectname", вероятно, будет уникален, это не должно приводить к коллизиям имени или неоднозначностям при большинстве обстоятельств. Можно также использовать включать путь и/или make's VPATH
функция для разделения физического расположения проекта через несколько каталогов если абсолютно необходимый (для размещения определенного для платформы автоматически сгенерированного кода, например; это - что-то, что действительно ломается, когда Вы используете #include "../../somefile.h"
).
IANALL, но я не думаю, что необходимо помещать ..
в фактический C или исходные файлы C++, потому что это не портативно, и стандарт не поддерживает его. Это подобно использованию \
в Windows. Только сделайте это, если Ваш компилятор не может работать ни с каким другим методом.
Думайте о своем исходном дереве как о вложенном пространстве имен, и включать путь позволяет Вам вытягивать каталоги в корень этого пространства имен. Вопросом является тогда одно из формирования логического пространства имен для Вашей кодовой базы независимо от того, как код организован на диске.
я избежал бы путей как:
"include/foo/bar.h"
— "включение" кажется нелогичным и избыточным "../foo/bar.h"
— ".." принимает относительное местоположение и хрупок "bar.h"
—, если bar.h не находится в текущем каталоге, это загрязняет глобальное пространство имен и просит неоднозначности. Лично, я склонен добавлять, что путь как следующее к моим проектам включает путь — "..;../..;../../..;../../../.."
.
Это позволяет Вам применять своего рода правило сокрытия к Вашему #include
с и позволяет некоторую свободу движущихся заголовков, не взламывая другой код. Конечно, это за счет представления риска привязки к неправильному заголовочному файлу, если Вы не осторожны, как неполностью определенные имена могут быть (или становиться со временем), неоднозначный.
я склонен полностью определять #include
с в общедоступных заголовках, таким образом, любые третьи лица, использующие мой код, не должны добавлять "..;../..;../../..;../../../.."
к своему проекту —, это - просто удобство для моей частной системы кодов и системы сборки.
Поскольку тогда Вы помещаете файл относительно корня проекта, и когда Вы проверяете его в управлении исходным кодом, и другой разработчик проверяет его к другому местоположению на их локальных системных вещах, все еще работают.