Если вы не знаете, что такое SOLID, то можете даже не идти на собеседование, да, да, я серьезно ;). Поэтому давайте разбираться:
SOLID — это набор принципов, следуя которым, программный код будет более чистым и гибким. Т.е. это не какае-то библиотека или технология, это просто правила, которым должен следовать любой адекватные разработчик, не зависимо на чем он программирует.
- S — Single-responsibility principle — принцип единой ответственности
- O — Open-closed principle — принцип открытости/закрытости.
- L — Liskov substitution principle — принцип подстановки Барбары Лисков
- I — Interface segregation principle — принцип разделения интерфейса
- D — Dependency Inversion Principle — принцип инверсии зависимостей
Запомнить названия по первости будет сложно, да к этому и не нужно стремиться. Главное понимать содержимое и те идеи, которые предлагаются в каждом из них. Я покажу принципы SOLID на примере языка Java, однако смысл применим к любому языку программирования.
S — Single-responsibility principle
Принцип единой ответственности означает, что один класс или файл должен иметь только одну цель и одно единственное назначение. Вы не имеете права создавать классы и файлы, которые представляют собой «комбайн» умеющий делать все.
Например, если ваш класс создан, что-бы отображать данные на экране, то не нужно размещать в этом классе логику получения этих данных из интернета.
Дело в том, что может получится ситуация, что меняя логику загрузки данных из интернета, вы случайно испортите логику отображения данных на экране. Поэтому работу с интернетом и отображением необходимо разделять на два разных класса.
Также, не забываем, что у вас есть интерфейсы и абстрактные классы, с помощью которых вы можете передавать интерфейс логики с интернетом, в класс для отображения. В итоге реализация интерфейса будет конкретная для конкретного случая, т.е. вам достаточно поменять реализацию интерфейса или абстрактного класса, если логика загрузки данных изменится.
Что-бы проверить, соответствует ли ваш класс этому принципу, задайте себе вопрос: Что может случится, из-за чего мне потребуется изменить данный класс?. Если ответов несколько, значит необходимо разделить класс на несколько.
Советую обратить внимание на следующие приемы, которые помогают соблюдать данный принцип:
- Разработка через тестирование (TDD)
- Паттерн «Выделение класса»(Extract Class)
- Паттерн «Фасад»(Facade)
- Паттерн Паттерн «Прокси»(Proxy)
- Паттерн «DAO»
O — Open-closed principle
Принцип открытости/закрытости означает, что программные сущности(классы, интерфейсы и т. д.) должны быть открыты для расширения, но закрыты для модификации.
Например, у вас есть класс, который выполняет определенные функции. Если вам понадобилось добавить дополнительный функционал, то необходимо создать наследника этого класса или использовать композицию. Но, изменять исходный класс запрещено. Это необходимо, что-бы не испортить код, использующий этот класс.
В ряде случаев рекомендуется избегать наследования и применять композицию, что-бы избежать сложных структур данных и сделать код еще более независимым.
Одним словом, изменять код базового класса строго настрого запрещено!
L — Liskov substitution principle
Принцип подстановки Барбары Лисков, самый не понятный принцип из-за названия :). Но все достаточно просто и немного похоже на предыдущий принцип. Принцип гласит, что поведение методов в дочернем классе должно следовать принципам базового класса, а не изменять их. То есть, дочерний класс переопределяя методы или переменные, не должен менять заложенную логику базового класса.
Например:
class Rectangle {
private int width;
private int height;
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
}
class Square implements Rectangle {
public void setSize(int size) {
super.setWidth(size);
super.setHeight(size);
}
}
Выглядит немного странно, правда? Класс Square(Квадрат) наследуется от Rectangle(прямоугольник), а так как у квадрата все стороны равны, в классе Square мы просто задаем ширину и высоту, одну и ту же. В итоге, мы испортили изначальную идею класса Rectangle, в который заложена логика, что стороны могут отличаться. Получается, не меняя базовый класс, мы умудрились нарушить данный принцип.
В этом примере Square должен быть отдельным классом и ни в коем случае не наследоваться от Rectangle. То есть, поведение методов не должно изменяться. Если написано, что метод возвращает ширину, значит он и должен возвращать ширину, а не что-то другое.
I — Interface segregation principle
Принцип разделения интерфейса. Тут все очень просто. Лучше создавать много отдельных узкоспециализированных интерфейсов, чем один, который включает в себя много функций. Это позволит сделать архитектуру более гибкой, и позволит использовать интерфейсы по отдельности. Этот принцип похож на самый первый, принцип единой ответственности.
Например:
interface ItemClick {
void onClick()
void onLongClick()
}
Итак, есть интерфейс, который требует реализовать два метода: короткое нажатие и длинное нажатие. Но что, если нам необходимо только короткое нажатие? В этом случае у нас будет, что-то такое:
class MyClass implements ItemClick {
void onClick() {
// тут реализуем необходимую логику
}
void onLongClick() {
// а вот тут нам нечего не надо делать, но все равно приходится
// реализовать этот метод потому, что этого требует интерфейс
}
}
Что-бы этого избежать необходимо сделать два разных интерфейса, которые можно применять по отдельности.
interface ItemClick {
void onClick()
}
interface ItemLongClick {
void onLongClick()
}
Так же посмотрите на пример, который был в статье про Композицию, мы создали новый интерфейс, вместо того, чтобы расширять существующий. Это позволяет использовать эти интерфейсы, как отдельно, так и вместе, что делает архитектуру более гибкой и изменяемой. Если бы мы создали новый метод в существующем классе, то нам пришлось бы реализовать его в классе, который его уже использует, а это значит, мы вмешиваемся в существующий код.
D — Dependency Inversion Principle
Модули верхних уровней не должны зависеть от модулей нижних уровней. Если по простому, то нужно делать код так, что-бы этот код имел как можно меньше зависимостей и не было круговых зависимостей, например модуль A зависит от модуля B, а модуль B зависит от модуля A.
Например, у вас есть следующие модули в приложении: presentation(модуль для показа чего либо на экране) и data(модуль для хранения и получения данных). Соответственно presentation будет зависеть от модуля data, так как ему необходимо получать данные для отображения их на экране, но вот модулю data совсем не нужно ничего знать о presentation, ему абсолютно все равно, как эти данные будут отображаться, модуль data просто предоставляет данные.
Обновлено 31 мая 2020
1 / 1 / 0 Регистрация: 24.05.2013 Сообщений: 117 |
|
1 |
|
Сломалась сборка и не открывается31.05.2019, 15:20. Показов 10095. Ответов 4
Кликните здесь для просмотра всего текста
Всем привет у меня случилась беда, сломалась сборка. Просто глюкнул солид и теперь сб не открывается. В интернете все перешарил говорят что все ничего не сделать. Может кто то все таки знает как это решить можно может исправить такую проблему?
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
31.05.2019, 15:20 |
Ответы с готовыми решениями: неодин браузер не открывается,скайп не открывается, фильмы не показываются,не один антивирус не открывается и не устанавливается Сломалась W7 Сломалась база Сломалась табличка 4 |
1 / 1 / 0 Регистрация: 24.05.2013 Сообщений: 117 |
|
31.05.2019, 15:21 [ТС] |
2 |
Первая ошибка вылазить при открытий документа 2 клик. А вторая при открытий через файл-открыть.
0 |
1473 / 627 / 139 Регистрация: 17.12.2013 Сообщений: 2,380 |
|
31.05.2019, 19:15 |
3 |
Обычно это значит что файл поврежден, и счастливых историй о восстановлении не встречал.
0 |
0 / 0 / 0 Регистрация: 29.03.2021 Сообщений: 1 |
|
29.03.2021, 11:38 |
4 |
У меня была похожая ситуация.
0 |
0 / 0 / 0 Регистрация: 10.02.2022 Сообщений: 1 |
|
10.02.2022, 21:05 |
5 |
Alex1988, спасибо огромное!
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
10.02.2022, 21:05 |
Помогаю со студенческими работами здесь Дата сломалась Сломалась видеокарта Сломалась видеокарта Сломалась клавиатура Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 5 |
-
Ответить в тему
-
Создать тему
Рекомендованные сообщения
skv
0
-
- Жалоба
- Рассказать
Доброго времени суток.
Возникла такая проблема: при открытии файла вылазит такое окошко. Что делать, чем лечить?
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
Spikard
45
-
- Жалоба
- Рассказать
если включено резервное копирование или что то подобное то там, если нет «шефвсепропало»
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
afenogen
7
skv
0
- Автор
-
- Жалоба
- Рассказать
11 минуту назад, afenogen сказал:
Возможно файл более поздней версии.
Нет, сам пять минут назад сохранил, потребовалось открыть и внести правки, а тут такое
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
jtok
704
-
- Жалоба
- Рассказать
Попробуйте еще перенести куда-нить открываемый файл, чтобы путь покороче был.
А вообще — бывает. Если нет копии в каталоге автосохранения, который указывается в настройках программы и там же настраивается, то всё.
Изменено 18 января 2017 пользователем jtok
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
Spikard
45
-
- Жалоба
- Рассказать
если тут не стоит галки — плохо
можно попробовать еще посмотреть в папке автовосстановления — но без особой надежды
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
Ярослав2014
4
-
- Жалоба
- Рассказать
16 минут назад, skv сказал:
Доброго времени суток.
Возникла такая проблема: при открытии файла вылазит такое окошко. Что делать, чем лечить?
Была похожая. При откате дерева вверх ( редактировал деталь). Потом при откате назад случилась проблема, дерево все видно, но редактировать его нельзя. что только не пробовал и папка восстановление тоже не помогла.
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
ff25tj
7
-
- Жалоба
- Рассказать
у меня такое тоже было, решал я так: за соседним компом запускал эту сборку и она открывалась, пересохранял и открывал на своей. Почему появлялась ошибка я выяснил: была одна сложная деталь сделаная поверхностным моделированием с офсетом из другой сложной поверхностной детали, я её переделал и ошибки перестали появляться.
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже.
Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.
-
Сейчас на странице
0 пользователей
Нет пользователей, просматривающих эту страницу.
-
Сообщения
-
Автор:
PROXXGT · Опубликовано: 17 минут назад
Да, такой. Станок без Баркфидера. Просто для удобства, ноль каждый раз не ставить. Хочу написать свою подпрограмму в пост. Но не знаю как вызвать ее выполнения в Esprit. А что за цикл, где искать ?
Нашел, все ясно. Спасибо, попробую
-
Автор:
Krusnik · Опубликовано: 29 минут назад
Потому что у вас он определён.
Объяснять создание эскиза это то же самое, что и объяснять как писать (ставьте ударение как хотите). Вам хочется писать — вы это делаете. Всё. Если вам хочется, но вы не можете это сделать — то тут очень сложно сформулировать что нужно исправить. Особенно на форуме.
-
Автор:
maxx2000 · Опубликовано: 37 минут назад
упор чтобы заготовка при подаче в него упиралась? если да то обычно это делают в оправку резца, обычно это первый в программе, его вызывают ещё раз в конце программы и подают в нужное место чтобы заготовка упёрлась в корпус. Можно использовать цикл исходная позиция.
-
Автор:
a_schelyaev · Опубликовано: 39 минут назад
S-A модель для трансзвука ваяли. У вас моделирование больше на карго-культ смахивает. Лес-то вам зачем?
-
-
-
-
Автор:
alex0800 · Опубликовано: 1 час назад
я очень много писал и работал с параметрами но до освоения солидкам
все что мне надо было мог получить.а параметры хороши там где много подобных деталей
-
Автор:
PROXXGT · Опубликовано: 1 час назад
Довожу до ума токарно-фрезерный пост. И доводить еще буду немало времени. Но рабочий вариант готов. Осталась мелочь которую хотелось бы добавить. Хочу написать что-то вроде своей траектории — чисто для упора. Прописал упор с подводами и отводами в посте, но он не постоянно нужен. Так либо два поста делать(с, и без упора — такое), либо потом ручками упор удалять. Идеи ?
-
-
Description
Want to be able to capture soldiers above S-rank in the campaign,without having to do FOBs? This mod will do that for you. It comes in two flavors.
spp_gradual: Once you have enough S rank soldiers, S+ soldiers will start appearing. Gather enough S+ soldiers, S++ will appear. Eventually, all soldiers will be S++.
spp_100: All soldiers everywhere are S++. This will help you quickly level your base.
Warning: It has been brought to my attention that two users may have been banned from FOBs and multiplayer. Use at your own risk.If you’re having issues getting the mod to work:
The mod still works, but sometimes the mod will stop working. I believe this is because small updates pushed by the developers causes the game to validate, removing the mod’s changes.
Solution:
- Run SnakeBite.
- (If a SnakeBite window pops up saying changes have been detected) Keep clicking next, letting it validate the game, until you’re at the regular SnakeBite window.
- Click ‘Mods’ (not the slider)
- Highlight ‘S++ 100%’
- Click ‘Uninstall’
- Click ‘Install .MGSV’
- Install the file you used before
- Start a new mission from the ACC to verify S+/S++ soldiers.
If that doesn’t work, here’s a tutorial on a full removal and install of ALL mods:
Updates
August 24, 2017: Released 1.12v1 for today’s patch (1.12).
August 24, 2017: Released 1.12v1 for today’s patch (1.12).August 24, 2017: Released 1.12v1 for today’s patch (1.12).
November 10: 2018: Released 1.15v1, noticed a mistake, and released 1.15v2.
August 5, 2018: Released v2 for 1.14. I fixed Windows Extract All error and removed unrelated files I accidentally included in v1.
August 4, 2018:
Released 1.14.v1 for the latest patch (1.14).
August 24, 2017:
Released 1.12v1 for today’s patch (1.12).
August 2, 2017:
Released 1.10v4 for yesterday’s patch. Tested and working.
June 23, 2017:
Updating description text.
May 14, 2017:
Version 1.10v3 has been uploaded. NEW: ‘gradual+secret.’ It’s the same as gradual, but there is always a 1% chance for a S++. Thank you to miketheratguy for the idea. I’ve updated the mod using the latest original game files and the latest version of SnakeBite (0.8.6). This should help avoid issues. There’s no need to update if you’re not having issues. Enjoy!
January 14, 2017: Tested and confirmed compatibility with SnakeBite Mod Manager 0.8.4. No changes made to my files.
October 11, 2016:
I’ve added an optional file that combines this mod with the Quick MB Brig Recruitment mod. Captured soldiers will skip the brig and go straight to your staff. Thanks for your permission, CantStoptheBipBop. You can find his mod here: http://www.nexusmods.com/metalgearsolidvtpp/mods/260/
October 11, 2016:
‘Gradual’ and ‘S++’ mods still work. The ‘S++_all’ doesn’t play well with the game’s auto-sort, so I’m not updating that anymore. I haven’t checked the ‘S++_&_story’ file yet.
August 17, 2016: Uploaded 1.10v2. I fixed a problem with the Gradual file causing S-rank and lower to appear once your motherbase hit a certain level. Thanks to halo35boy for bringing to issue to my attention. I recommend updating if you used 1.10v1.August 9, 2016: I’ve made minor text changes. The description in SnakeBite was showing an old version number. No changes were made to the mod, so I’m keeping it as 1.10v1. There’s no need to update if you grabbed the file that has been available since August 2nd. I left the original 1.10v1 just in case.
August 2, 2016:Patch 1.10 was deployed today. I tested SPP_100%_(1.09v8) and it worked for me. I’m changing the mod file’s version to match the game version, but no changes have been made.
July 31, 2016: The gradual file wasn’t working properly. Fixed in 1.09v8.
July 27, 2016:
I messed up the ‘gradual’ file. It was 100% S++ at all base levels. Fixed in 1.09v7. No other changes made.
July 25, 2016: There was an issue where only S rank and lower to appear when using the gradual file. Corrected in 1.09v6. No other changes made. I removed old and unrelated files from the download page.
June 6, 2016: 1.09v5 adds a file that makes unique characters like Ocelot, Huey, Malak have all S++ stats. No changes were made to the other files.
June 1, 2016: As per request, I’ve added a file that makes all soldiers stats be S++ that I’m labeling ‘100% all’. It’s been added to the main file as 1.09v4. No changes have been made to ‘gradual’ and ‘100%.’ The Self-Installer has not been updated.
May 25, 2016 #2: I forgot to add the gradual file in the SnakeBite package. Added in 1.09v3. Changed version of self-installer to 1.09v3 to match, but no changes were made.
May 25, 2016 #1: I fixed an issue for the 100% that caused normal soldiers to appear in the field. Fix applied to the self-installer and SnakeBite files.
May 24, 2016: I installed the mod from scratch using the 100% using SnakeBite. If you’re having trouble getting the mod to work: reinstall SnakeBite, validate your files, and reinstall the mod. Keep in mind that the self-installer won’t work if SnakeBite is installed.
May 10, 2016 #2:
Fixed compatibility with SnakeBite.
May 10, 2016 #1: Added compatibility for patch 1.09. I combined the original gradual .lua and 100% .lua. Choose one.
May 9, 2016: Adding compatibility for SnakeBite mod manager [SBWM]. Please let me know if you have any issues. Patch 1.09 broke this. I’ll look into fixing this later.
March 15, 2016: Tested for compatibility with patch 1.08. It works, but you may have to re-run DoItForMe.bat. Re-named latest version of mod from 1.07.v2 to 1.08 to reflect compatibility with patch 1.08. No changes made were made to the mod.
February 22, 2016: Added optional LUA that gives S++ 100%, regardless of base level.
Explanation
«totalSection» represents the combined platform levels. sp are S+ and spp are S++. The number value is a percent. Each row must add up to 100.
totalSectionLv=385,g=0,f=0,e=0,d=0,c=11,b=31,a=35,s=15,sp=8,spp=0}
totalSectionLv=392,g=0,f=0,e=0,d=0,c=11,b=31,a=35,s=15,sp=8,spp=0}
totalSectionLv=399,g=0,f=0,e=0,d=0,c=11,b=31,a=35,s=15,sp=8,spp=0}
totalSectionLv=406,g=0,f=0,e=0,d=0,c=11,b=31,a=35,s=15,sp=8,spp=0}
totalSectionLv=413,g=0,f=0,e=0,d=0,c=5,b=25,a=35,s=20,sp=15,spp=0}
totalSectionLv=420,g=0,f=0,e=0,d=0,c=5,b=25,a=35,s=20,sp=15,spp=0}
totalSectionLv=427,g=0,f=0,e=0,d=0,c=5,b=25,a=35,s=20,sp=15,spp=0}
totalSectionLv=434,g=0,f=0,e=0,d=0,c=0,b=20,a=35,s=20,sp=20,spp=5}
totalSectionLv=441,g=0,f=0,e=0,d=0,c=0,b=20,a=35,s=20,sp=20,spp=5}
totalSectionLv=448,g=0,f=0,e=0,d=0,c=0,b=20,a=35,s=20,sp=20,spp=5}
totalSectionLv=455,g=0,f=0,e=0,d=0,c=0,b=20,a=35,s=20,sp=20,spp=5}
totalSectionLv=518,g=0,f=0,e=0,d=0,c=0,b=20,a=35,s=20,sp=20,spp=5}
totalSectionLv=574,g=0,f=0,e=0,d=0,c=0,b=0,a=15,s=35,sp=35,spp=15}
totalSectionLv=630,g=0,f=0,e=0,d=0,c=0,b=0,a=15,s=35,sp=35,spp=15}
totalSectionLv=686,g=0,f=0,e=0,d=0,c=0,b=0,a=15,s=35,sp=35,spp=15}
totalSectionLv=728,g=0,f=0,e=0,d=0,c=0,b=0,a=15,s=35,sp=35,spp=15}
totalSectionLv=756,g=0,f=0,e=0,d=0,c=0,b=0,a=5,s=35,sp=40,spp=20}
totalSectionLv=784,g=0,f=0,e=0,d=0,c=0,b=0,a=5,s=35,sp=40,spp=20}
totalSectionLv=812,g=0,f=0,e=0,d=0,c=0,b=0,a=5,s=35,sp=40,spp=20}
totalSectionLv=840,g=0,f=0,e=0,d=0,c=0,b=0,a=0,s=0,sp=50,spp=50}
totalSectionLv=868,g=0,f=0,e=0,d=0,c=0,b=0,a=0,s=0,sp=50,spp=50}
totalSectionLv=882,g=0,f=0,e=0,d=0,c=0,b=0,a=0,s=0,sp=50,spp=50}
totalSectionLv=910,g=0,f=0,e=0,d=0,c=0,b=0,a=0,s=0,sp=50,spp=50}
totalSectionLv=1050,g=0,f=0,e=0,d=0,c=0,b=0,a=0,s=0,sp=0,spp=100}
Credit
This is an updated version of Rawrkanos’ S plus plus Soldier Mod.