Недоречна близькість (англ. Inappropriate Intimacy) — один із «запахів коду», тобто код із ознаками проблем у системі. Суть «запаху» полягає у тому, що один клас використовує службові поля і методи іншого класу. Для уникнення недоречної близькості між класам потрібно пам'ятати, що класи повинні знати один про одного якомога менше. Такі класи легше підтримувати і повторно використовувати
Проблема
License у методі GetSummary() використовує методи об'єкта motorist, Motorist у методі getRiskFactor() використовує методи об'єкта license (приклад коду на Java)
public class License { private Motorist motorist; private int points = 0; public void setMotorist (Motorist motorist) { this.motorist = motorist } public int getPoints() { return points; } public void addPoints(int points) { this.points +=points; } public String getSummary() { // includes information about motorist (method in the wrong place) return motorist.getTitle() + " " + motorist.getFirstName() + " " + motorist.getSurname() + ", " + Integer.toString(getPoints()) + " points"; } } public class Motorist { public final License license; private final String surname; private final String firstName; private final String title; public Motorist (License license, String surname, String firstName, String title) { license.setMotorist(this); this.license = license; this.surname = surname; this.firstName = firstName; this.title = title; } public String getSurname() { return surname; } public String getFirstName { return firstName; } public String getTitle() { return Title } public String getRiskFactor() { // risk factor is calculated using the number of points from the license (method in the wrong place) if (license.getPoints() > 3) return "HIGH_RISK"; if (license.getPoints() > 0) return "MODERATE_RISK"; return "LOW_RISK"; } }
Лікування
- Найпростіший вихід за допомогою переміщення методу і переміщення поля перенести частини одного класу в інший (в той, де вони використовуються). Проте це може спрацювати тільки в тому випадку, якщо оригінальний клас не використовує переміщувані поля і методи.
- Іншим рішенням є відокремлення залежних частин в окремий клас і приховання делегування до цього класу.
- Якщо між класами існує взаємна залежність, варто використати заміну двонаправленого зв'язку на однонапрямлену.
- Якщо близькість виникає між підкласом і батьківським класом, краще розглянути можливість заміни делегування наслідуванням.
Належне лікування для попереднього приладу:
public class License { private int points = 0; public int getPoints() { return points; } public void addPoints(int points) { this.points +=points; } public RiskFactor getRiskFactor() { if (getPoints() > 3) return "HIGH_RISK"; if (getPoints() > 0) return "MODERATE_RISK"; return "LOW_RISK"; } } public class Motorist { public final License license; private final String surname; private final String firstName; private final String title; public Motorist (License license, String surname, String firstName, String title) { this.license = license; this.surname = surname; this.firstName = firstName; this.title = title; } public String getSurname() { return surname; } public String getFirstName { return firstName; } public String getTitle() { return Title } public String getSummary() { // includes information about Motorist return getTitle() + " " + getFirstName() + " " + getSurName() + ", " + license.getPoints() + " points"; } }
Переваги
- Покращення організації коду;
- Спрощення технічної підтримки і повторного використання коду.
Див. також
Посилання
- Недоречна близькість [ 17 грудня 2014 у Wayback Machine.]
- Inappropriate Intimacy Example [ 22 листопада 2016 у Wayback Machine.]
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Nedorechna blizkist angl Inappropriate Intimacy odin iz zapahiv kodu tobto kod iz oznakami problem u sistemi Sut zapahu polyagaye u tomu sho odin klas vikoristovuye sluzhbovi polya i metodi inshogo klasu Dlya uniknennya nedorechnoyi blizkosti mizh klasam potribno pam yatati sho klasi povinni znati odin pro odnogo yakomoga menshe Taki klasi legshe pidtrimuvati i povtorno vikoristovuvatiProblemaLicense u metodi GetSummary vikoristovuye metodi ob yekta motorist Motorist u metodi getRiskFactor vikoristovuye metodi ob yekta license priklad kodu na Java public class License private Motorist motorist private int points 0 public void setMotorist Motorist motorist this motorist motorist public int getPoints return points public void addPoints int points this points points public String getSummary includes information about motorist method in the wrong place return motorist getTitle motorist getFirstName motorist getSurname Integer toString getPoints points public class Motorist public final License license private final String surname private final String firstName private final String title public Motorist License license String surname String firstName String title license setMotorist this this license license this surname surname this firstName firstName this title title public String getSurname return surname public String getFirstName return firstName public String getTitle return Title public String getRiskFactor risk factor is calculated using the number of points from the license method in the wrong place if license getPoints gt 3 return HIGH RISK if license getPoints gt 0 return MODERATE RISK return LOW RISK LikuvannyaNajprostishij vihid za dopomogoyu peremishennya metodu i peremishennya polya perenesti chastini odnogo klasu v inshij v toj de voni vikoristovuyutsya Prote ce mozhe spracyuvati tilki v tomu vipadku yaksho originalnij klas ne vikoristovuye peremishuvani polya i metodi Inshim rishennyam ye vidokremlennya zalezhnih chastin v okremij klas i prihovannya deleguvannya do cogo klasu Yaksho mizh klasami isnuye vzayemna zalezhnist varto vikoristati zaminu dvonapravlenogo zv yazku na odnonapryamlenu Yaksho blizkist vinikaye mizh pidklasom i batkivskim klasom krashe rozglyanuti mozhlivist zamini deleguvannya nasliduvannyam Nalezhne likuvannya dlya poperednogo priladu public class License private int points 0 public int getPoints return points public void addPoints int points this points points public RiskFactor getRiskFactor if getPoints gt 3 return HIGH RISK if getPoints gt 0 return MODERATE RISK return LOW RISK public class Motorist public final License license private final String surname private final String firstName private final String title public Motorist License license String surname String firstName String title this license license this surname surname this firstName firstName this title title public String getSurname return surname public String getFirstName return firstName public String getTitle return Title public String getSummary includes information about Motorist return getTitle getFirstName getSurName license getPoints points PerevagiPokrashennya organizaciyi kodu Sproshennya tehnichnoyi pidtrimki i povtornogo vikoristannya kodu Div takozhZazdrisni funkciyiPosilannyaNedorechna blizkist 17 grudnya 2014 u Wayback Machine Inappropriate Intimacy Example 22 listopada 2016 u Wayback Machine Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi