Может быть полезно программировать интерфейсы, даже если мы не зависим от абстракций.
Программирование на интерфейсы заставляет нас использовать контекстно-зависимое подмножество объекта. Это помогает, потому что это:
Например, рассмотрим класс Person
, который реализует интерфейс Friend
и Employee
.
class Person implements AbstractEmployee, AbstractFriend {
}
В контексте дня рождения человека мы программируем интерфейс Friend
, чтобы предотвратить обращение с человеком как Employee
.
function party() {
const friend: Friend = new Person("Kathryn");
friend.HaveFun();
}
В контексте работы человека мы программируем интерфейс Employee
, чтобы предотвратить размывание границ рабочего места.
function workplace() {
const employee: Employee = new Person("Kathryn");
employee.DoWork();
}
Отлично. Мы ведем себя соответственно в разных контекстах, и наше программное обеспечение работает хорошо.
В будущем, если наш бизнес изменится для работы с собаками, мы сможем довольно легко изменить программное обеспечение. Сначала мы создаем класс Dog
, который реализует как Friend
, так и Employee
. Затем мы благополучно меняем new Person()
на new Dog()
. Даже если обе функции имеют тысячи строк кода, это простое редактирование будет работать, потому что мы знаем следующее:
party
использует только подмножество Friend
в Person
. workplace
использует только подмножество Employee
в Person
. Dog
реализует интерфейсы Friend
и Employee
. С другой стороны, если либо party
, либо workplace
должны были запрограммироваться против Person
, существует риск того, что оба имеют Person
-специфический код. Переход от Person
в Dog
потребовал бы, чтобы мы расчесывали код, чтобы искоренить любой Person
-специфический код, который Dog
не поддерживает.
Мораль: программирование на интерфейсы помогает нашему коду вести себя надлежащим образом и быть готовыми к переменам. Он также подготавливает наш код к зависимости от абстракций, что приносит еще больше преимуществ.
Сообщение о конфликте:
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD
означает, что res/layout/dialog_item.xml
был удален в ветви диалога, который вы объединяете, но был изменен в HEAD (в ветке, в которую вы слияете).
Итак, вы должны решить, удалить ли
git rm res/layout/dialog_item.xml
» или
git add res/layout/dialog_item.xml
» Затем вы завершаете слияние с «git commit
».
Обратите внимание, что git предупредит вас, что вы создаете фиксацию слияния в (редком) случае, когда это то, чего вы не хотите. Вероятно, остается от дней, когда указанный случай был реже.
Если вы используете Git Gui для окон,
Я обычно запускаю git mergetool
, и он подскажет мне, хочу ли я сохранить измененный файл или удалить его. Это самый быстрый способ IMHO, поскольку это одна команда вместо нескольких файлов.
git rm …
), но я получаю…: needs merge
иrm '…'
, которые у меня трудная интерпретация. И затем, если я попытаюсь выполнить, stackoverflow.com/questions/19985906/… снова появится. – Jesse Glick 6 March 2014 в 19:43git ls-files --stage
и / илиgit status --porcelain
и / илиgit diff-files <something>
, чтобы получить список измененных файлов и диск сценария для их удаления или принятия вашей или их версии. – Jakub Narębski 13 January 2015 в 23:31