Принцип подстановки Барбары Лисков: основа правильного полиморфизма в программировании 🌟
Привет, друзья! Сегодня мы поговорим о третьей букве в акрониме SOLID - L, которая означает принцип подстановки Лисков 🤔. Этот принцип гласит, что объекты подклассов должны быть взаимозаменяемы с объектами их базового класса без нарушения корректности работы программы 💻.
Почему это важно? 🤔 Нарушение LSP приводит к непредсказуемому поведению программы, код начинает проверять типы объектов с помощью if/else или is, что противоречит принципу открытости/закрытости и делает систему хрупкой 🌪. Соблюдение LSP гарантирует, что полиморфизм работает правильно и подклассы действительно являются специализацией базового класса 🔩.
Давайте рассмотрим пример нарушения LSP 🚫:
Здесь функция, принимающая Bird, ожидает, что любой потомок сможет летать. Но при подстановке пингвина код валится с ошибкой, значит, иерархия нарушает принцип Лисков 🚫.
А теперь пример правильного использования LSP 🌟:
Ключевые правила LSP 📝:
✔️ Предусловия не могут быть усилены в подклассе — подкласс не должен требовать больше, чем базовый класс
✔️ Постусловия не могут быть ослаблены в подклассе — подкласс должен гарантировать как минимум то, что гарантирует базовый класс
✔️ Инварианты должны сохраняться — свойства, которые истинны для базового класса, должны оставаться истинными для подклассов
✔️ Исключения — подкласс не должен выбрасывать новые типы исключений, которые не ожидаются от базового класса
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly
Привет, друзья! Сегодня мы поговорим о третьей букве в акрониме SOLID - L, которая означает принцип подстановки Лисков 🤔. Этот принцип гласит, что объекты подклассов должны быть взаимозаменяемы с объектами их базового класса без нарушения корректности работы программы 💻.
Почему это важно? 🤔 Нарушение LSP приводит к непредсказуемому поведению программы, код начинает проверять типы объектов с помощью if/else или is, что противоречит принципу открытости/закрытости и делает систему хрупкой 🌪. Соблюдение LSP гарантирует, что полиморфизм работает правильно и подклассы действительно являются специализацией базового класса 🔩.
Давайте рассмотрим пример нарушения LSP 🚫:
class Bird {
void fly() {
print("Flying");
}
}
class Penguin extends Bird {
@override
void fly() {
throw Exception("Cannot fly"); // Нарушение LSP
}
}
Здесь функция, принимающая Bird, ожидает, что любой потомок сможет летать. Но при подстановке пингвина код валится с ошибкой, значит, иерархия нарушает принцип Лисков 🚫.
А теперь пример правильного использования LSP 🌟:
abstract class Bird {
void move();
}
class Sparrow extends Bird {
@override
void move() {
print("Flying");
}
}
class Penguin extends Bird {
@override
void move() {
print("Swimming");
}
}
Ключевые правила LSP 📝:
✔️ Предусловия не могут быть усилены в подклассе — подкласс не должен требовать больше, чем базовый класс
✔️ Постусловия не могут быть ослаблены в подклассе — подкласс должен гарантировать как минимум то, что гарантирует базовый класс
✔️ Инварианты должны сохраняться — свойства, которые истинны для базового класса, должны оставаться истинными для подклассов
✔️ Исключения — подкласс не должен выбрасывать новые типы исключений, которые не ожидаются от базового класса
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly
🔥2
🪙 Жизненный цикл Flutter-приложения: как отслеживать изменения состояний 📱
Каждое мобильное приложение проходит через ряд состояний, определяемых перечислением
Существует пять основных состояний:
-
-
-
-
-
Чтобы отслеживать изменения этих состояний, мы используем
Пример работы с
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly #mobiledevelopment #appdevelopment
Каждое мобильное приложение проходит через ряд состояний, определяемых перечислением
AppLifecycleState. Чтобы корректно реагировать на эти события, нам нужно понимать, какие состояния существуют и как на них реагировать. Существует пять основных состояний:
-
resumed: приложение находится на переднем плане и готово к взаимодействию с пользователем 📈-
inactive: приложение временно неактивно, например, при поступлении звонка 📞-
paused: приложение уходит в фон и не реагирует на действия пользователя 📊-
hidden: приложение скрыто от пользователя, но процесс остается в памяти и готов к быстрому возобновлению 🔒-
detached: приложение больше не активно и готовится к завершению 🔴Чтобы отслеживать изменения этих состояний, мы используем
WidgetsBindingObserver и его метод didChangeAppLifecycleState, который вызывается каждый раз, когда система переводит приложение между состояниями. Пример работы с
didChangeAppLifecycleState:
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
setState(() {
if (state == AppLifecycleState.resumed) {
appState = 'Возобновлено';
} else if (state == AppLifecycleState.inactive) {
appState = 'Неактивно';
} else if (state == AppLifecycleState.paused) {
appState = 'Приостановлено';
} else if (state == AppLifecycleState.detached) {
appState = 'Отключено';
} else if (state == AppLifecycleState.hidden) {
appState = 'Скрыто';
}
});
}
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly #mobiledevelopment #appdevelopment
👍3🔥1
💎 Выбор аккаунта разработчика: индивидуальный или корпоративный?
Привет, друзья! 💬 Сегодня мы поговорим о важном этапе перед публикацией приложения в Google Play и AppStore - создании аккаунта разработчика. 📈 Этот аккаунт может быть двух видов: индивидуальный и корпоративный. 🤔
Индивидуальный аккаунт - это аккаунт физического лица, который регистрируется на конкретного человека. 📝 Преимущества такого аккаунта включают быстрый процесс регистрации, минимальное количество документов и проверок, отсутствие необходимости наличия официально зарегистрированного юридического лица, меньше бюрократии и более низкие затраты на содержание. 💸 Однако, есть и недостатки: ограничения в доступах, даже для администраторов, указание имени владельца аккаунта в карточке приложения, что может повлиять на репутацию продукта, доход поступает как доход физического лица и требуются особые условия для публикации. 📊
Корпоративный аккаунт регистрируется на официальное юридическое лицо. 📈 Преимущества включают более высокое доверие клиентов, поскольку они видят перед собой целую компанию, а не одного человека, огромный выбор ролевых моделей в управлении проектом, возможность делегирования ключевых прав и удобное ведение бизнеса. 📈 Однако, есть и недостатки: сложный процесс регистрации, требующий много документов и времени, более строгие требования к соответствию внутренним правилам и возможные ограничения для разработчиков из определенных стран. 🚫
Итак, какой аккаунт выбрать? 🤔 Если вы работаете над pet-проектом, стартапом или экспериментальным продуктом, индивидуальный аккаунт может быть оптимальным вариантом. 🌟 Однако, если ваше приложение является частью полноценного бизнеса или у вас большая команда разработчиков, лучше выбрать аккаунт юридического лица. 📈
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly #mobiledevelopment #appdevelopment
Привет, друзья! 💬 Сегодня мы поговорим о важном этапе перед публикацией приложения в Google Play и AppStore - создании аккаунта разработчика. 📈 Этот аккаунт может быть двух видов: индивидуальный и корпоративный. 🤔
Индивидуальный аккаунт - это аккаунт физического лица, который регистрируется на конкретного человека. 📝 Преимущества такого аккаунта включают быстрый процесс регистрации, минимальное количество документов и проверок, отсутствие необходимости наличия официально зарегистрированного юридического лица, меньше бюрократии и более низкие затраты на содержание. 💸 Однако, есть и недостатки: ограничения в доступах, даже для администраторов, указание имени владельца аккаунта в карточке приложения, что может повлиять на репутацию продукта, доход поступает как доход физического лица и требуются особые условия для публикации. 📊
Корпоративный аккаунт регистрируется на официальное юридическое лицо. 📈 Преимущества включают более высокое доверие клиентов, поскольку они видят перед собой целую компанию, а не одного человека, огромный выбор ролевых моделей в управлении проектом, возможность делегирования ключевых прав и удобное ведение бизнеса. 📈 Однако, есть и недостатки: сложный процесс регистрации, требующий много документов и времени, более строгие требования к соответствию внутренним правилам и возможные ограничения для разработчиков из определенных стран. 🚫
Итак, какой аккаунт выбрать? 🤔 Если вы работаете над pet-проектом, стартапом или экспериментальным продуктом, индивидуальный аккаунт может быть оптимальным вариантом. 🌟 Однако, если ваше приложение является частью полноценного бизнеса или у вас большая команда разработчиков, лучше выбрать аккаунт юридического лица. 📈
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly #mobiledevelopment #appdevelopment
💭 Реализация перетаскивания файлов в Flutter с помощью пакета desktop_drop 📁💻
Привет, друзья! Сегодня я хочу рассказать вам о пакете desktop_drop, который позволяет реализовать перетаскивание файлов в ваших десктоп- или веб-приложениях на Flutter. 🌟
Пакет предоставляет виджет
Основные свойства
✔️
✔️
✔️
✔️
✔️
Пример использования
Также можно визуально показывать, что область готова принять файл, используя состояния, отслеживаемые через
При работе с
▪️ Разные платформы могут по-разному обрабатывать события перетаскивания
▪️ С помощью
▪️ Для безопасной работы всегда проверяйте тип, размер и количество файлов
❕ Для полноценного функционала работы с файлами
❤️ — если было полезно
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly
Привет, друзья! Сегодня я хочу рассказать вам о пакете desktop_drop, который позволяет реализовать перетаскивание файлов в ваших десктоп- или веб-приложениях на Flutter. 🌟
Пакет предоставляет виджет
DropTarget, который определяет область, на которую можно перетаскивать файлы. Этот виджет невидим, но он позволяет вам определять область для перетаскивания вокруг своего child. 📈Основные свойства
DropTarget включают:✔️
onDragEntered — вызывается, когда файл входит в область виджета✔️
onDragExited — вызывается, когда файл покидает область виджета✔️
onDragDone — вызывается после того, как файл был отпущен внутри области✔️
onDragUpdated — вызывается при движении файла внутри области✔️
child — виджет, который отображается внутри области DropTargetПример использования
DropTarget:
DropTarget(
onDragDone: (detail) {
for (final file in detail.files) {
print(file.path);
}
},
onDragEntered: (detail) => print('Файл в области'),
onDragExited: (detail) => print('Файл вне области'),
child: // some child
)
Также можно визуально показывать, что область готова принять файл, используя состояния, отслеживаемые через
onDragEntered и onDragExited.При работе с
desktop_drop есть несколько нюансов, о которых стоит помнить:▪️ Разные платформы могут по-разному обрабатывать события перетаскивания
▪️ С помощью
DropDoneDetails можно получать пути к файлам и обрабатывать их без необходимости загружать весь файл в память▪️ Для безопасной работы всегда проверяйте тип, размер и количество файлов
❕ Для полноценного функционала работы с файлами
desktop_drop можно комбинировать с file_picker и другими пакетами.❤️ — если было полезно
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly
👍1