Size: a a a

2019 October 08

F

FOX in Kotlin Start
Andrew Mikhaylov
В твоём примере явно есть обособленное необязательное поведение. Такого не должно быть в интерфейсе.
согласен, разделил интерфейсы на 2 - для записи и для чтения. Теперь у меня разные классы - NetHleper, FileHelper, SQLHelper реализуют их понеобходимости.
Спасибо за подсказку. Подзабыл про SOLID
источник

AM

Andrew Mikhaylov in Kotlin Start
Я бы не сказал, что это о S из SOLID, потому что у второго интерфейса, который наследует первый, всё равно два поведения. Это вообще не о SOLID. Это просто о том, какие обещания ты декларируешь интерфейсами.
источник

AM

Andrew Mikhaylov in Kotlin Start
С двумя ты точно говоришь — "вот тут можно только читать, вот тут можно читать и писать". С одним — "тут можно читать и наверное можно писать, я не знаю". Очевидно, первый удобнее в использовании.
источник

n

neikist in Kotlin Start
Andrew Mikhaylov
Я бы не сказал, что это о S из SOLID, потому что у второго интерфейса, который наследует первый, всё равно два поведения. Это вообще не о SOLID. Это просто о том, какие обещания ты декларируешь интерфейсами.
Я думаю автор говорил про I из солида, но да, это не I
источник

AM

Andrew Mikhaylov in Kotlin Start
И да, Александр правильно отметил, что котлин ровно такой переход от второго к первому сделал, распиливая джавовые коллекции на два типа.
источник

F

FOX in Kotlin Start
Andrew Mikhaylov
Я бы не сказал, что это о S из SOLID, потому что у второго интерфейса, который наследует первый, всё равно два поведения. Это вообще не о SOLID. Это просто о том, какие обещания ты декларируешь интерфейсами.
Это вроде I из SOLID. Не?
источник

AM

Andrew Mikhaylov in Kotlin Start
My bad, читаю задницей. Я даже не знаю, ISP это или нет — формально реализующий интерфейс с дефолтным методом никак от него не зависит, и если дефолтный метод выбросить из интерфейса, реализующий этот класс можно вообще не менять.
источник

F

FOX in Kotlin Start
Andrew Mikhaylov
С двумя ты точно говоришь — "вот тут можно только читать, вот тут можно читать и писать". С одним — "тут можно читать и наверное можно писать, я не знаю". Очевидно, первый удобнее в использовании.
Так я и не спорю, конечно кода больше, но удобнее в разы. спасибо еще раз на наводку
источник

AN

Alexander Nozik in Kotlin Start
Andrew Mikhaylov
My bad, читаю задницей. Я даже не знаю, ISP это или нет — формально реализующий интерфейс с дефолтным методом никак от него не зависит, и если дефолтный метод выбросить из интерфейса, реализующий этот класс можно вообще не менять.
Дефолтные реализации, которые не будут реимплементиться лучше вообще в экстеншены выносить
источник

F

FOX in Kotlin Start
neikist
Я думаю автор говорил про I из солида, но да, это не I
Ну, тут подходит и принцип разделеняи интерфейсов, и принцип единой ответственности
источник

n

neikist in Kotlin Start
FOX
Ну, тут подходит и принцип разделеняи интерфейсов, и принцип единой ответственности
SRP скорее о реализации а не о контрактах
источник

AM

Andrew Mikhaylov in Kotlin Start
Alexander Nozik
Дефолтные реализации, которые не будут реимплементиться лучше вообще в экстеншены выносить
Только если они гарантировано не будут реимплементиться. Если их можно реимпмлементить с целью повышения перформанса, why not.
источник

F

FOX in Kotlin Start
Кстати, вот что хотел еще спросить, я так понимаю что давать другое название переменной в классе, реализующем интерфейс - плохая практика?
источник

AN

Alexander Nozik in Kotlin Start
Andrew Mikhaylov
Только если они гарантировано не будут реимплементиться. Если их можно реимпмлементить с целью повышения перформанса, why not.
ну я именно про случай, когда это не часть поведения, а просто удобные переопределения методов
источник

AN

Alexander Nozik in Kotlin Start
FOX
Кстати, вот что хотел еще спросить, я так понимаю что давать другое название переменной в классе, реализующем интерфейс - плохая практика?
Ну зависист. Если нет для этого мотивации, то да, лучше, чтобы было единообразно. Но иогда и осмысленно, например если класс дженерик, а у объекта наследника какой-то новый смысл возникает. Идея не рекомендует.
источник

F

FOX in Kotlin Start
Alexander Nozik
Ну зависист. Если нет для этого мотивации, то да, лучше, чтобы было единообразно. Но иогда и осмысленно, например если класс дженерик, а у объекта наследника какой-то новый смысл возникает. Идея не рекомендует.
Вот пример.
interface DataProvider<T> {
   fun getData(file: T): String
}

но напрмиер класс NetHelper, который получает данные из сети также реализует этот интерфейс, и там не файл, а ссылка на JSON. поэтому логично было бы сделать так
class NetHelper:DataProvider<String> {
   override fun getData(link: String): String {}
}
источник

AN

Alexander Nozik in Kotlin Start
FOX
Вот пример.
interface DataProvider<T> {
   fun getData(file: T): String
}

но напрмиер класс NetHelper, который получает данные из сети также реализует этот интерфейс, и там не файл, а ссылка на JSON. поэтому логично было бы сделать так
class NetHelper:DataProvider<String> {
   override fun getData(link: String): String {}
}
Ну вполне.
источник

AM

Andrew Mikhaylov in Kotlin Start
Это про возможность вызывать функцию с указанием имён параметров, и там можно схлопотать себе паззлер. Но я не помню, в чём его суть, если честно.
источник

F

FOX in Kotlin Start
Alexander Nozik
Ну вполне.
Согласен, но IDEA не то чтобы ругается, а предупреждает о смене имени переменной
источник

AN

Alexander Nozik in Kotlin Start
FOX
Согласен, но IDEA не то чтобы ругается, а предупреждает о смене имени переменной
Ну потому что это потенциальный источник ошибок. Она не жестко ругается. Можно следовать, можно не следовать
источник