JavaRush /Блоги Java /Random-TG /Антипаттернҳо чист? Биёед мисолҳоро дида бароем (қисми 1)...

Антипаттернҳо чист? Биёед мисолҳоро дида бароем (қисми 1)

Дар гурӯҳ нашр шудааст
Антипаттернҳо чист?  Биёед мисолҳоро дида бароем (қисми 1) - 1Рӯзи хуб ба ҳама! Рӯзи дигар бо ман мусоҳиба карданд ва ба ман дар бораи антипаттернҳо савол доданд: ин чӣ гуна ҳайвони ваҳшӣ аст, навъҳо ва намунаҳои онҳо дар амал чӣ гунаанд. Албатта, ман ба ин савол ҷавоб додам, аммо хеле рӯякӣ, зеро ман ба омӯзиши ин масъала чандон амиқ нарафтам. Пас аз мусоҳиба ман ба ҷустуҷӯи Интернет шурӯъ кардам ва ба ин мавзӯъ бештар ғарқ шудам. Имрӯз ман мехостам шарҳи мухтасари маъмултарин антипаттернҳо ва намунаҳои онҳоро кунам, ки хондани он метавонад ба шумо дар ин масъала дониши зарурӣ диҳад. Биёед оғоз кунем! Пас, пеш аз он ки антипаттерн чист, биёед дар хотир дорем, ки намуна чист. Намуна як тарҳи такроршавандаи меъморӣ барои ҳалли мушкилот ё ҳолатҳои умумӣ мебошад, ки ҳангоми тарҳрезии барнома ба вуҷуд меоянд. Аммо имрӯз мо дар бораи онҳо не, балки дар бораи муқобorятҳои онҳо - антипаттернҳо сухан меронем. Анти намуна як равиши маъмул барои ҳалли як синфи мушкилоти маъмул аст, ки бесамар, хатарнок ё бесамар аст. Ба ибораи дигар, ин як шакли хато аст (инчунин баъзан дом номида мешавад). Антипаттернҳо чист?  Биёед мисолҳоро дида бароем (қисми 1) - 2Чун қоида, антипаттернҳо ба намудҳои зерин тақсим мешаванд:
  1. Антипаттернҳои меъморӣ - антипаттернҳои меъморӣ, ки ҳангоми тарҳрезии сохтори система ба вуҷуд меоянд (одатан аз ҷониби меъмор).
  2. Менеҷмент Anti Pattern - антиплаттерҳо дар соҳаи менеҷмент, ки одатан бо менеҷерони гуногун (ё гурӯҳҳои менеҷерҳо) дучор мешаванд.
  3. Development Anti Pattern - антипаттернҳо мушкилоти рушд мебошанд, ки ҳангоми навиштани система барномасозони оддӣ ба миён меоянд.
Экзотикии антипаттернҳо хеле васеътар аст, аммо мо имрӯз онҳоро баррасӣ намекунем, зеро барои таҳиягарони оддӣ ин хеле душвор хоҳад буд. Барои оғоз, биёед як намунаи антипаттернро дар соҳаи менеҷмент гирем.

1. Фалаҷи таҳлилӣ

Фалаҷи таҳлил як намунаи классикии ташкилӣ ба ҳисоб меравад. Он аз ҳад зиёд таҳлor вазъро ҳангоми банақшагирӣ дар бар мегирад, то ҳеҷ як қарор ё амале андешида нашавад, ки рушди онро фалаҷ мекунад. Ин аксар вақт рӯй медиҳад, вақте ки ҳадаф ноил шудан ба камолот ва пурра анҷом додани давраи таҳлил аст. Ин намунаи зидди намунаи бо гардиш дар доираҳо (як навъ ҳалқаи пӯшида), аз нав дида баромадан ва сохтани моделҳои муфассал тавсиф мешавад, ки дар навбати худ ба ҷараёни кор халал мерасонад. Масалан, шумо кӯшиш карда истодаед, ки чизҳоеро пешгӯӣ кунед: чӣ мешавад, агар корбар ногаҳон мехоҳад рӯйхати кормандонро дар асоси ҳарфҳои чорум ва панҷуми номи худ созад, аз ҷумла дар рӯйхат лоиҳаҳое, ки онҳо дар байни онҳо вақти бештари кориро ба онҳо бахшидаанд. Соли нав ва хаштуми март дар чор соли гузашта? Аслан, ин аз ҳад зиёди таҳлил аст. Мисоли хуби ҳаёти воқеӣ ин аст, ки чӣ гуна фалаҷи таҳлил Kodak-ро ба муфлисшавӣ овард . Инҳоянд чанд маслиҳатҳои хурд барои мубориза бо фалаҷи таҳлил:
  1. Шумо бояд ҳадафи дарозмуддатро ҳамчун чароғаки қабули қарор муайян кунед, то ҳар як қарори қабулкардаатон шуморо ба ҳадафатон наздиктар кунад ва шуморо маҷбур накунад, ки вақтро қайд кунед.
  2. Ба чизҳои майда-чуйда тамаркуз накунед (чаро дар бораи як нозукии ночиз қарор қабул кунед, ки гӯё ин охирин дар ҳаёти шумо бошад?)
  3. Мӯҳлати қабули қарорро муқаррар кунед.
  4. Барои мукаммал ичро кардани ягон вазифа кушиш накунед: онро хеле хуб ичро кардан бехтар аст.
Мо хеле амиқ намеравем ва ҳоло дигар антипаттернҳои идоракуниро баррасӣ мекунем. Аз ин рӯ, бидуни муқаддима, биёед ба баъзе антипаттернҳои меъморӣ гузарем, зеро эҳтимолан ин мақоларо таҳиягарони оянда мехонанд, на менеҷерҳо.

2. Худо эътироз мекунад

Объекти илоҳӣ як намунаи зиддитеррорист, ки консентратсияи аз ҳад зиёди функсияҳои аз ҳад зиёд ноҳамворро тасвир мекунад ва миқдори зиёди маълумоти гуногунро нигоҳ медорад (an objectе, ки дар атрофи он барнома давр мезанад). Биёед як мисоли хурдро гирем:
public class SomeUserGodObject {
   private static final String FIND_ALL_USERS_EN = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_date FROM users;
   private static final String FIND_BY_ID = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_date FROM users WHERE id = ?";
   private static final String FIND_ALL_CUSTOMERS = "SELECT id, u.email, u.phone, u.first_name_en, u.middle_name_en, u.last_name_en, u.created_date" +
           "  WHERE u.id IN (SELECT up.user_id FROM user_permissions up WHERE up.permission_id = ?)";
   private static final String FIND_BY_EMAIL = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_dateFROM users WHERE email = ?";
   private static final String LIMIT_OFFSET = " LIMIT ? OFFSET ?";
   private static final String ORDER = " ORDER BY ISNULL(last_name_en), last_name_en, ISNULL(first_name_en), first_name_en, ISNULL(last_name_ru), " +
           "last_name_ru, ISNULL(first_name_ru), first_name_ru";
   private static final String CREATE_USER_EN = "INSERT INTO users(id, phone, email, first_name_en, middle_name_en, last_name_en, created_date) " +
           "VALUES (?, ?, ?, ?, ?, ?, ?)";
   private static final String FIND_ID_BY_LANG_CODE = "SELECT id FROM languages WHERE lang_code = ?";
                                  ........
   private final JdbcTemplate jdbcTemplate;
   private Map<String, String> firstName;
   private Map<String, String> middleName;
   private Map<String, String> lastName;
   private List<Long> permission;
                                   ........
   @Override
   public List<User> findAllEnCustomers(Long permissionId) {
       return jdbcTemplate.query( FIND_ALL_CUSTOMERS + ORDER, userRowMapper(), permissionId);
   }
   @Override
   public List<User> findAllEn() {
       return jdbcTemplate.query(FIND_ALL_USERS_EN + ORDER, userRowMapper());
   }
   @Override
   public Optional<List<User>> findAllEnByEmail(String email) {
       var query = FIND_ALL_USERS_EN + FIND_BY_EMAIL + ORDER;
       return Optional.ofNullable(jdbcTemplate.query(query, userRowMapper(), email));
   }
                              .............
   private List<User> findAllWithoutPageEn(Long permissionId, Type type) {
       switch (type) {
           case USERS:
               return findAllEnUsers(permissionId);
           case CUSTOMERS:
               return findAllEnCustomers(permissionId);
           default:
               return findAllEn();
       }
   }
                              ..............private RowMapper<User> userRowMapperEn() {
       return (rs, rowNum) ->
               User.builder()
                       .id(rs.getLong("id"))
                       .email(rs.getString("email"))
                       .accessFailed(rs.getInt("access_counter"))
                       .createdDate(rs.getObject("created_date", LocalDateTime.class))
                       .firstName(rs.getString("first_name_en"))
                       .middleName(rs.getString("middle_name_en"))
                       .lastName(rs.getString("last_name_en"))
                       .phone(rs.getString("phone"))
                       .build();
   }
}
Дар ин ҷо мо як намуди синфи калонеро мебинем, ки ҳама чизро якбора иҷро мекунад. Дарбаргирандаи дархостҳо ба Пойгоҳи додаҳо, дорои баъзе маълумотҳо, мо инчунин усули фасадро findAllWithoutPageEnбо мантиқи тиҷорат мебинем. Чунин як ашёи илоҳӣ бузург ва бесарусомон мешавад, то ба таври кофӣ дастгирӣ кунад. Мо бояд бо он дар ҳар як порчаи code кор кунем: бисёре аз гиреҳҳои система ба он такя мекунанд ва бо он зич пайваст шудаанд. Нигох доштани чунин codeхо торафт душвортар мегардад. Дар чунин мавридхо онро ба синфхои алохида таксим кардан лозим меояд, ки хар кадоми онхо танхо як максад (максад) доранд. Дар ин мисол, шумо метавонед онро ба синфи дао тақсим кунед:
public class UserDaoImpl {
   private static final String FIND_ALL_USERS_EN = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_date FROM users;
   private static final String FIND_BY_ID = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_date FROM users WHERE id = ?";

                                   ........
   private final JdbcTemplate jdbcTemplate;

                                   ........
   @Override
   public List<User> findAllEnCustomers(Long permissionId) {
       return jdbcTemplate.query(FIND_ALL_CUSTOMERS + ORDER, userRowMapper(), permissionId);
   }
   @Override
   public List<User> findAllEn() {
       return jdbcTemplate.query(FIND_ALL_USERS_EN + ORDER, userRowMapper());
   }

                               ........
}
Синфи дорои маълумот ва усулҳои дастрасӣ ба он:
public class UserInfo {
   private Map<String, String> firstName;..
   public Map<String, String> getFirstName() {
       return firstName;
   }
   public void setFirstName(Map<String, String> firstName) {
       this.firstName = firstName;
   }
                    ....
Ва беҳтар мебуд, ки усулро бо мантиқи тиҷорат ба хидмат интиқол диҳед:
private List<User> findAllWithoutPageEn(Long permissionId, Type type) {
   switch (type) {
       case USERS:
           return findAllEnUsers(permissionId);
       case CUSTOMERS:
           return findAllEnCustomers(permissionId);
       default:
           return findAllEn();
   }
}

3.Синглтон

Синглтон намунаи соддатаринест, ки кафолат медиҳад, ки як намунаи баъзе синфҳо дар як замимаи як ришта мавҷуд аст ва нуқтаи дастрасии умумиро ба он an object таъмин мекунад. Шумо метавонед бештар дар бораи он дар ин ҷо бихонед . Аммо ин намуна аст ё антипаттерн? Антипаттернҳо чист?  Биёед мисолҳоро дида бароем (қисми 1) - 3Биёед камбудиҳои ин қолабро дида бароем:
  1. Ҳолати ҷаҳонӣ. Вақте ки мо ба як мисоли синф дастрасӣ пайдо мекунем, мо ҳолати кунунии он синфро намедонем ё онро кӣ ва кай иваз кардааст ва ин ҳолат он чизест, ки мо интизор нестем. Ба ибораи дигар, дурустии кор бо синглтон аз тартиби зангҳо ба он вобаста аст, ки зерсистемаҳоро аз ҳамдигар вобаста мекунад ва дар натиҷа мураккабии рушдро ба таври ҷиддӣ зиёд мекунад.

  2. Singleton яке аз принсипҳои SOLID - Принсипи Масъулияти ягонаро вайрон мекунад - синфи Singleton ба ғайр аз иҷрои масъулиятҳои фаврии худ, инчунин шумораи мисолҳои худро назорат мекунад.

  3. Вобастагии синфи муқаррарӣ аз синглтон дар интерфейси синф намоён нест. Азбаски одатан як мисоли синглтон дар параметрҳои усул гузаронида намешавад, балки мустақиман тавассути getInstance(), барои муайян кардани вобастагии синф аз синглтон ба даст оварда мешавад, шумо бояд ба татбиқи ҳар як усул омӯзед - танҳо дидани омма шартномаи an object кифоя нест.

    Мавҷудияти синглтон қобorяти санҷиши барномаро дар маҷмӯъ ва синфҳоеро, ки синглтонро истифода мебаранд, коҳиш медиҳад. Аввалан, шумо наметавонед an objectи Mock-ро ба ҷои синглтон гузоред ва дуюм, агар синглтон интерфейси тағир додани ҳолати худро дошта бошад, санҷишҳо аз ҳамдигар вобаста хоҳанд буд.

    Ба ибораи дигар, як синглтон пайвастшавиро афзоиш медиҳад ва ҳамаи гуфтаҳои дар боло зикршуда танҳо натиҷаи афзоиши пайвастшавӣ нестанд.

    Ва агар шумо дар ин бора фикр кунед, аз истифодаи синглтон пешгирӣ кардан мумкин аст. Масалан, барои назорат кардани шумораи мисолҳои an object, истифода бурдани навъҳои гуногуни заводҳо комилан имконпазир аст (ва зарур аст).

    Хавфи калонтарин дар кӯшиши сохтани тамоми меъмории барномаҳо дар асоси синглтонҳост. Бисёр алтернативаҳои бузург ба ин равиш вуҷуд доранд. Намунаи муҳимтарин ин Баҳор аст, яъне контейнерҳои IoC он: дар он ҷо масъалаи назорати эҷоди хидматҳо табиатан ҳал карда мешавад, зеро онҳо дар асл "заводҳои стероидҳо" мебошанд.

    Ҳоло дар ин мавзӯъ холиварҳои зиёде мавҷуданд, бинобар ин шумо қарор медиҳед, ки синглтон намуна аст ё антипаттерн.

    Ва мо дар ин бора таваққуф намекунем ва ба намунаи охирини тарроҳии имрӯза мегузарем - poltergeist.

4. Полтергеист

Poltergeist як антипаттернҳои синфии бефоида аст, ки барои даъват кардани усулҳои синфи дигар истифода мешавад ё танҳо як қабати абстраксияи нолозимро илова мекунад. Антипаттерн дар шакли an objectҳои кӯтоҳмуддат, ки аз ҳолат холӣ аст, зоҳир мешавад. Ин an objectҳо аксар вақт барои оғоз кардани дигар an objectҳои устувортар истифода мешаванд.
public class UserManager {
   private UserService service;
   public UserManager(UserService userService) {
       service = userService;
   }
   User createUser(User user) {
       return service.create(user);
   }
   Long findAllUsers(){
       return service.findAll().size();
   }
   String findEmailById(Long id) {
       return service.findById(id).getEmail();}
   User findUserByEmail(String email) {
       return service.findByEmail(email);
   }
   User deleteUserById(Long id) {
       return service.delete(id);
   }
}
Чаро ба мо an objectе лозим аст, ки миёнарав бошаду кори худро ба каси дигар вогузорад? Мо онро нест мекунем ва функсияҳои хурдеро, ки он амалӣ мекунад, ба an objectҳои дарозмуддат интиқол медиҳем. Минбаъд, мо ба намунаҳое мегузарем, ки ба мо таваҷҷӯҳи бештар доранд (ҳамчун таҳиягарони оддӣ) - development antipatterns .

5. Рамзи сахт

Ҳамин тавр, мо ба ин калимаи даҳшатнок расидем - codeи сахт. Моҳияти ин антипаттерн дар он аст, ки code ба конфигуратсияи мушаххаси сахтафзор ва/ё муҳити система сахт алоқаманд аст, ки интиқоли онро ба конфигуратсияҳои дигар хеле мушкил мекунад. Ин антипаттерн бо рақамҳои ҷодугарӣ зич алоқаманд аст (онҳо аксар вақт бо ҳам пайвастанд). Мисол:
public Connection buildConnection() throws Exception {
   Class.forName("com.mysql.cj.jdbc.Driver");
   connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/someDb?characterEncoding=UTF-8&characterSetResults=UTF-8&serverTimezone=UTC", "user01", "12345qwert");
   return connection;
}
Нохун зад, ҳамин тавр не? Дар ин ҷо мо бевосита конфигуратсияи пайвасти худро муқаррар мекунем; дар натиҷа, code танҳо бо MySQL дуруст кор мекунад ва барои тағир додани базаи маълумот шумо бояд ба code ворид шавед ва ҳама чизро дастӣ тағир диҳед. Як ҳалли хуб ин гузоштани конфигуратсияҳо дар файли алоҳида хоҳад буд:
spring:
  datasource:
    jdbc-url:jdbc:mysql://localhost:3306/someDb?characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username:  user01
    password:  12345qwert
Варианти дигар ин аст, ки онро ба доимӣ интиқол диҳед.

6. Лангари киштӣ

Лангари қаиқ дар заминаи антипаттернҳо маънои нигоҳ доштани қисмҳои истифоданашудаи системаро дорад, ки пас аз баъзе оптимизатсия ё рефакторинг боқӣ мондаанд. Инчунин, баъзе қисмҳои codeро метавон "барои оянда" боқӣ гузошт, агар шумо онҳоро дубора истифода баред. Ин аслан codeро ба қуттии партов табдил медиҳад. Антипаттернҳо чист?  Биёед мисолҳоро дида бароем (қисми 1) - 4Мисол:
public User update(Long id, User request) {
   User user = mergeUser(findById(id), request);
   return userDAO.update(user);
}
private User mergeUser(User findUser, User requestUser) {
   return new User(
           findUser.getId(),
           requestUser.getEmail() != null ? requestUser.getEmail() : findUser.getEmail(),
           requestUser.getFirstName() != null ? requestUser.getFirstName() : findUser.getFirstNameRu(),
           requestUser.getMiddleName() != null ? requestUser.getMiddleName() : findUser.getMiddleNameRu(),
           requestUser.getLastName() != null ? requestUser.getLastName() : findUser.getLastNameEn(),
           requestUser.getPhone() != null ? requestUser.getPhone() : findUser.getPhone());
}
Мо як усули навсозӣ дорем, ки усули алоҳида барои муттаҳид кардани маълумоти корбар аз пойгоҳи додаҳо ва шахсе, ки барои навсозӣ омадааст (агар шахсе, ки барои навсозӣ омадааст, майдони холӣ дошта бошад, пас он ҳамчун усули кӯҳна навишта мешавад) аз базаи маълумот). Ва барои мисол, як талабот вуҷуд дошт, ки сабтҳо набояд бо сабтҳои кӯҳна якҷоя карда шаванд, балки бар онҳо навишта шаванд, ҳатто агар майдонҳои холӣ вуҷуд дошта бошанд:
public User update(Long id, User request) {
   return userDAO.update(user);
}
Дар натиҷа, mergeUserон дигар истифода намешавад ва ҳазф кардани он афсӯс аст: чӣ мешавад, агар он (ё идеяи он) ҳоло ҳам муфид бошад? Чунин code танҳо системаҳоро мураккаб ва печида мегардонад, аслан ягон арзиши амалӣ намедиҳад. Мо набояд фаромӯш кунем, ки чунин code бо "пораҳои мурда" ҳангоми рафтан ба лоиҳаи дигар ба ҳамкасбонатон душвор хоҳад буд. Усули беҳтарини мубориза бо лангарҳои киштӣ ин рефакторинги code, яъне нест кардани ин қисмҳои code мебошад (афсус, мутаассифона). Инчунин, ҳангоми банақшагирии рушд, шумо бояд пайдоиши чунин лангарҳоро ба назар гиред (барои тоза кардани партовҳо вақт ҷудо кунед).

7. Чӯҷаи an object

Барои тавсифи ин антипаттерн, шумо аввал бояд бо намунаи ҳавзи an object шинос шавед . Ҳавзи an objectӣ (ҳавзи захираҳо) як намунаи тарроҳии тавлидкунанда , маҷмӯи an objectҳоест, ки оғоз карда шудаанд ва барои истифода омодаанд. Вақте ки барнома an objectро талаб мекунад, он аз нав сохта намешавад, балки аз ин ҳавз гирифта мешавад. Вақте ки ашё дигар лозим нест, он нест карда намешавад, балки ба ҳавз бармегардад. Одатан барои an objectҳои вазнин истифода мешавад, ки барои эҷоди ҳар дафъа захираҳо зиёданд, ба монанди пайвасти пойгоҳи додаҳо. Барои мисол як мисоли хурду оддиро дида мебароем. Ҳамин тавр, мо синфе дорем, ки ин намунаро ифода мекунад:
class ReusablePool {
   private static ReusablePool pool;
   private List<Resource> list = new LinkedList<>();
   private ReusablePool() {
       for (int i = 0; i < 3; i++)
           list.add(new Resource());
   }
   public static ReusablePool getInstance() {
       if (pool == null) {
           pool = new ReusablePool();
       }
       return pool;
   }
   public Resource acquireResource() {
       if (list.size() == 0) {
           return new Resource();
       } else {
           Resource r = list.get(0);
           list.remove(r);
           return r;
       }
   }
   public void releaseResource(Resource r) {
       list.add(r);
   }
}
Мо ин синфро дар шакли намунаи singleton /antipattern дар боло тавсифшуда пешниҳод мекунем , яъне танҳо як an objectи ин намуд мавҷуд буда метавонад, он дар an objectҳои муайян амал мекунад Resource, ба таври нобаёнӣ дар конструктор ҳавз бо 4 нусха пур карда мешавад; вакте ки ин гуна предмет гирифта мешавад, аз хавз дур карда мешавад (агар он набошад, офарида мешавад ва фавран ба вай дода мешавад) ва дар охир усули баргардонидани ашё мавчуд аст. Объектҳо Resourceчунин ба назар мерасанд:
public class Resource {
   private Map<String, String> patterns;
   public Resource() {
       patterns = new HashMap<>();
       patterns.put("заместитель", "https://studfile.net/preview/3676297/page:3/");
       patterns.put("мост", "https://studfile.net/preview/3676297/page:4/");
       patterns.put("фасад", "https://studfile.net/preview/3676297/page:5/");
       patterns.put("строитель", "https://studfile.net/preview/3676297/page:6/#16");
   }
   public Map<String, String> getPatterns() {
       return patterns;
   }
   public void setPatterns(Map<String, String> patterns) {
       this.patterns = patterns;
   }
}
Дар ин ҷо мо an objectи хурде дорем, ки дорои харита бо номи намунаҳо ҳамчун калид ва истинод ба онҳо ҳамчун арзиш ва инчунин усулҳои дастрасӣ ба харита. Биёед бубинем main:
class SomeMain {
   public static void main(String[] args) {
       ReusablePool pool = ReusablePool.getInstance();

       Resource firstResource = pool.acquireResource();
       Map<String, String> firstPatterns = firstResource.getPatterns();
       // ......Howим-то образом используем нашу мапу.....
       pool.releaseResource(firstResource);

       Resource secondResource = pool.acquireResource();
       Map<String, String> secondPatterns = firstResource.getPatterns();
       // ......Howим-то образом используем нашу мапу.....
       pool.releaseResource(secondResource);

       Resource thirdResource = pool.acquireResource();
       Map<String, String> thirdPatterns = firstResource.getPatterns();
       // ......Howим-то образом используем нашу мапу.....
       pool.releaseResource(thirdResource);
   }
}
Ҳама чиз дар ин ҷо низ равшан аст: мо an objectи ҳавзро мегирем, an objectро бо захираҳо аз он мебарем, аз он харита мегирем, бо он коре мекунем ва ҳамаашро барои истифодаи минбаъда дар ҳавз мегузорем. Voila: дар ин ҷо шумо намунаи ҳавзи an objectро доред. Аммо мо дар бораи антипаттернҳо гап мезадем, ҳамин тавр не? Биёед ба ин парванда назар андозем main:
Resource fourthResource = pool.acquireResource();
   Map<String, String> fourthPatterns = firstResource.getPatterns();
// ......Howим-то образом используем нашу мапу.....
fourthPatterns.clear();
firstPatterns.put("first","blablabla");
firstPatterns.put("second","blablabla");
firstPatterns.put("third","blablabla");
firstPatterns.put("fourth","blablabla");
pool.releaseResource(fourthResource);
Дар ин ҷо боз як an objectи захиравӣ гирифта мешавад, харитаи он бо намунаҳо гирифта мешавад ва бо он коре анҷом дода мешавад, аммо пеш аз захира кардан ба ҳавзи an object, харита тоза карда мешавад ва бо маълумоти нофаҳмо пур карда мешавад, ки ин an objectи захираро барои истифодаи дубора номувофиқ месозад. Яке аз нозукиҳои асосии ҳавзи an objectҳо дар он аст, ки пас аз баргардонидани an object, он бояд ба ҳолати мувофиқ барои истифодаи минбаъдаи он баргардонида шавад. Агар an objectҳо пас аз баргардонидан ба ҳавз дар ҳолати нодуруст ё номуайян қарор дошта бошанд, ин сохторро партовгоҳи an object меноманд. Нигоҳ доштани an objectҳое, ки дубора истифода намешаванд, чӣ маъно дорад? Дар ин ҳолат, шумо метавонед харитаи дохorро дар созанда тағирнопазир гардонед:
public Resource() {
   patterns = new HashMap<>();
   patterns.put("заместитель", "https://studfile.net/preview/3676297/page:3/");
   patterns.put("мост", "https://studfile.net/preview/3676297/page:4/");
   patterns.put("фасад", "https://studfile.net/preview/3676297/page:5/");
   patterns.put("строитель", "https://studfile.net/preview/3676297/page:6/#16");
   patterns = Collections.unmodifiableMap(patterns);
}
(кӯшишҳо ва хоҳиши тағир додани мундариҷа дар якҷоягӣ бо UnsupportedOperationException меафтанд). Антипаттернҳо домҳое мебошанд, ки таҳиягарон аксар вақт бо сабаби нарасидани вақт, беэҳтиётӣ, бетаҷрибагӣ ё зарбаҳои менеҷерҳо ба онҳо меафтанд. Норасоии маъмулии вақт ва шитоб метавонад дар оянда барои барнома мушкилоти калон ба бор орад, бинобар ин, ин хатогиҳоро пешакӣ донистан ва пешгирӣ кардан лозим аст. Антипаттернҳо чист?  Биёед мисолҳоро дида бароем (қисми 1) - 6Бо хамин кисми якуми макола ба охир расид: давом дорад .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION