По моему скромному мнению, преимущество утиного ввода становится увеличенным, когда Вы придерживаетесь некоторых соглашений, таких как именование Вас переменные и методы последовательным способом. Беря пример от [1 115] Ken G, я думаю, что это читало бы лучше всего:
class SimpleResults {
def mapOfListResults
def total
def categories
}
Скажем, Вы определяете контракт на некоторой операции, названной 'calculateRating (A, B)', где A и B придерживаются другого контракта. В псевдокоде это читало бы:
Long calculateRating(A someObj, B, otherObj) {
//some fake algorithm here:
if(someObj.doStuff('foo') > otherObj.doStuff('bar')) return someObj.calcRating());
else return otherObj.calcRating();
}
, Если Вы хотите реализовать это в Java, и A и B должны реализовать некоторый интерфейс, который читает что-то вроде этого:
public interface MyService {
public int doStuff(String input);
}
Кроме того, если Вы хотите обобщить Вас контракт для вычисления оценок (скажем, у Вас есть другой алгоритм для оценки вычислений), также необходимо создать интерфейс:
public long calculateRating(MyService A, MyServiceB);
С утиным вводом, можно угробить Ваш интерфейсы и просто положиться, что на времени выполнения, и A и B правильно ответят на Ваш doStuff()
вызовы. Нет никакой потребности в определенном определении контракта. Это может работать на Вас, но это может также работать против Вас.
оборотная сторона - то, что необходимо быть дополнительны осторожный, чтобы гарантировать, что код не повреждается, когда некоторые другие люди изменяют его (т.е., другой человек должен знать о неявном контракте на имени метода и аргументах).
Примечание, которое это ухудшает особенно в Java, где синтаксис не является столь кратким, как это могло быть (по сравнению с Scala, например). Контрпример этого платформа Лифта , где они говорят, что количество SLOC платформы подобно направляющие , но тестовый код имеет меньше строк, потому что они не должны реализовывать проверки типа в тестах.
При компиляции исходного файла компилятор продолжается через несколько фаз.
Preprocessing
- обрабатывает язык обработки макроса, что означает, что он заменит макросы в Вашем тексте по их определениям. Разделения .h
и .m
. В XCode можно посмотреть на вывод препроцессора .m
файл путем выбора
select .m file -> Product -> Perform Action -> Preprocess
Compiling
- Генерация кода и Оптимизация. Переводит код в промежуточный код низкого уровня. XCode позволяет Вам рассмотреть вывод блока .m
файл путем выбора. Часто Вы видите этот файл, когда отладка, которую помещает код, что Вы не принадлежите
select .m file -> Product -> Perform Action -> Assemble
Assembling
(производят .o
) - преобразовывает (человекочитаемый) ассемблерный код в машинный код. Это создает файл целевого объекта, часто просто названный объектным файлом. Эти файлы имеют.o файл, заканчивающийся <глоток> [Мужественный] глоток> В XCode, you’ll находят эти объектные файлы в <product_name>.build/Objects-normal
папка в каталоге производных данных Вашего проекта.
Linking
(производят .app
, .a
, .framework
...) - символы твердости между объектными файлами и библиотеками. Компоновщик берет все объектные файлы и библиотеки и разрешает любые неизвестные символы. Это тогда кодирует в заключительный исполняемый файл, которым этот символ может быть найден в lib, и компоновщик тогда производит заключительный исполняемый файл
, Также можно использовать Report Navigator
для получения дополнительной информации о процессе сборки