JavaRush /Блоги Java /Random-TG /Баҳор дахшатнок нест, қабати DTO
Павел
Сатҳи

Баҳор дахшатнок нест, қабати DTO

Дар гурӯҳ нашр шудааст
МУНДАРИЖАИ СИКЛИ МАКОЛА Мо суханро дар бораи бахор давом медихем. Имрӯз мо намунаи DTO-ро таҳлил хоҳем кард, барои фаҳмидани шумо метавонед дар ин ҷо хонед . Душвортарин чизе дар бораи DTO фаҳмидани он аст, ки чаро он лозим аст. Биёед дар бораи сабзавот фикру мулоҳизаҳоро оғоз кунем ва дар айни замон, каме code нависед, шояд дар роҳ чизе равшантар шавад. Лоиҳаи пурборкунандаи баҳор эҷод кунед, h2 ва Lombok -ро пайваст кунед . Эҷоди бастаҳо: an objectҳо, анборҳо, хидматҳо, утилҳо. Дар субъектҳо, як an objectи Маҳсулот эҷод кунед:
package ru.java.rush.entities;

import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Accessors(chain = true)
@Entity
@Data
public class ProductEntity {

    @Id
    @Column
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    Integer id;

    @Column
    String name;

    @Column
    Integer purchasePrice;//закупочная цена

}
Синфҳои ProducRepository, ProducService ва синфи ItiiateUtil -ро амалӣ кунед ( монанд ба мақолаи қаблӣ ). Фарз мекунем, ки мо картошкаро бо нархи яклухт барои як кг 20 рубл ва сабзиро 14 рубл харидем. Мо махсулоти харидашударо дар анбор мегузорем. Биёед ба базаи маълумот сабтҳои зеринро илова кунем: [Id =1, ном = "Картошка", хариди Нарх = 20] [Id =2, ном = "Сабзӣ", buyPrice = 14] Ҳамчун тахминҳои арзанда, мо бояд молҳои худро фоидаовар фурӯшем, барои ин биёед онро зебо бастабандӣ кунем ва мо нархро боло мебарем. Яъне, мо сабзавотҳои ифлос ва ҷолибро дар як тӯда ҷамъ карда будем, аммо аз сегменти боҳашамат маҳсулоти вегетариании премиум тоза хоҳанд буд. Розӣ шавед, ин дигар ҳамон маҳсулоте (an object), ки мо ба таври оммавӣ харида будем, нахоҳад буд. Барои маҳсулоти нав бастаи dto ва дар он синфи ProductDto эҷод кунед
package ru.java.rush.dto;

import lombok.Data;

@Data
public class ProductDto {
    Integer id;
    String name;
    Integer purchasePrice;
    String  packaging;//упаковка
    Integer salePrice;//цена реализации
}
ProductDto ду тағирёбанда дорад, ки ProductEntity надорад: "бастабандӣ" ва "нархи фурӯш". Объекти dto метавонад айнан ҳамон тағирёбандаҳоро дар бар гирад, ё шояд шумораи онҳо бештар ё камтар бошад. Мо дар хотир дорем, ки табдил додани як an object ба an objectи дигар масъалаи харитасозӣ аст. Дар бастаи utils мо синфи MappingUtils-ро эҷод мекунем
package ru.java.rush.utils;

import org.springframework.stereotype.Service;
import ru.java.rush.dto.ProductDto;
import ru.java.rush.entities.ProductEntity;

@Service
public class MappingUtils {
//из entity в dto
    public ProductDto mapToProductDto(ProductEntity entity){
        ProductDto dto = new ProductDto();
        dto.setId(entity.getId());
        dto.setName(entity.getName());
        dto.setPurchasePrice(entity.getPurchasePrice());
        return dto;
    }
//из dto в entity
    public ProductEntity mapToProductEntity(ProductDto dto){
        ProductEntity entity = new ProductEntity();
        entity.setId(dto.getId());
        entity.setName(dto.getName());
        entity.setPurchasePrice(dto.getPurchasePrice());
        return entity;
    }
}
Мо танҳо майдонҳоро аз як an object бо майдонҳои шабеҳи an objectи дигар пур мекунем. Дар синфи ProductService мо усулҳои ҷустуҷӯи як маҳсулот ё рӯйхати маҳсулотро амалӣ менамоем, аммо пеш аз ин мо бо истифода аз усули дар боло навишташуда an objectро ба dto табдил медиҳем.
private final ProductRepository productRepository;
private final MappingUtils mappingUtils;


//для листа продуктов мы использовали стрим
public List<ProductDto> findAll() {
    return productRepository.findAll().stream() //создали из листа стирим
            .map(mappingUtils::mapToProductDto) //оператором из streamAPI map, использовали для каждого element метод mapToProductDto из класса MappingUtils
.collect(Collectors.toList()); //превратor стрим обратно в коллекцию, а точнее в лист
}

//для одиночного продукта обошлись проще
public ProductDto findById(Integer id) {
    return mappingUtils.mapToProductDto( //в метод mapToProductDto
            productRepository.findById(id) //поместor результат поиска по id
                    .orElse(new ProductEntity()) //если ни чего не нашли, то вернем пустой entity
    );
}
Агар мо ҳоло ин сабзавотро ба намоиш гузорем, чӣ мешавад? Биёед мебинем. Барои ин, рамзи зеринро дар ItiiateUtil нависед ва онро иҷро кунед.
System.out.println("\nВитрина магазина");
for (ProductDto dto : productService.findAll()) {
    System.out.println(dto);
}
Натиҷа ин аст: Намоиши мағозаи МаҳсулотDto(id=1, ном=Картошка, харидиНарҳ=20, бастабандӣ=null, salePrice=null) ProductDto(id=2, ном=Сабзӣ, харидиНархи=14, банду баст=Нул, salePrice=null) Бале, ман не! Ин гуна сабзавотро касе намехарад: онхо ифлос, бастабанди нашудаанд ва нархи фуруш маълум нест. Вақти мантиқи тиҷорат аст. Мо онро дар синфи ProductService татбиқ мекунем. Биёед аввал якчанд тағирёбандаҳоро ба ин синф илова кунем:
private final Integer margin = 5;//это наша накрутка на цену
private final String packaging = "Упаковано в лучшем виде";//так будет выглядеть упаковка
Барои ҳар як амал: бастабандӣ ва нархгузорӣ, мо дар як синф усули алоҳида эҷод мекунем:
// упаковываем товар
public void pack(List<ProductDto> list) {
    list.forEach(productDto ->
            productDto.setPackaging(packaging)
    );
}

// делаем деньги
public void makeMoney(List<ProductDto> list) {
    list.forEach(productDto ->
            productDto.setSalePrice(productDto.getPurchasePrice() * margin)
    );
}
Мо ба ItiiateUtil бармегардем ва дисплейро дар экран бо рамзи зерин иваз мекунем
List<ProductDto> productDtos = productService.findAll();

productService.pack(productDtos);
productService.makeMoney(productDtos);

System.out.println("\nВитрина магазина");
for (ProductDto dto : productDtos)) {
    System.out.println(dto);
}
Мо иҷро мекунем: Намоиши мағозаи МаҳсулотDto (id=1, ном=Картошка, хариди Нарх=20, бастабандӣ=Бо роҳи беҳтарин бастабандишуда, фурӯшНархи=100) МаҳсулотDto(id=2, ном=Сабзӣ, харидиНарҳ=14, бастабандӣ=Бастан) ба таври беҳтарин, salePrice = 70) Маҳсулот зебо бастабандӣ шудааст, нарх вуҷуд дорад, аммо оё шумо дар ягон ҷо дар экран нархеро, ки шумо онро яклухт харидаед ва дигар ID-ро дидаед. Мо codeи дар боло навишташударо бо файл тағир медиҳем:
List<ProductDto> productDtos = productService.findAll();

productService.pack(productDtos);
productService.makeMoney(productDtos);

System.out.println("\nВитрина магазина");
for (ProductDto dto : productDtos) {
    System.out.println(String.format(
            "Купите: %s , по цене:  %d", dto.getName(), dto.getSalePrice()
    ));
}
class InitiateUtils дар ниҳоят бояд чунин бошад:
@Service
@RequiredArgsConstructor
public class InitiateUtils implements CommandLineRunner {

    private final ProductService productService;

    @Override
    public void run(String... args) throws Exception {

        List<ProductEntity> products = new ArrayList<>(
                Arrays.asList(
                        new ProductEntity()
                                .setName("Картофель")
                                .setPurchasePrice(20),
                        new ProductEntity()
                                .setName("Морковь")
                                .setPurchasePrice(14)
                ));

        productService.saveAll(products);

        List<ProductDto> productDtos = productService.findAll();

        productService.pack(productDtos);
        productService.makeMoney(productDtos);

        System.out.println("\nВитрина магазина");
        for (ProductDto dto : productDtos) {
            System.out.println(String.format(
                    "Купите: %s , по цене:  %d", dto.getName(), dto.getSalePrice()
            ));
        }
    }
}
Биёед ба кор андозем: Тирезаи мағоза Харед: Картошка, нарх: 100 Харед: Сабзӣ, нарх: 70 Чизи дигар! Ҳоло мо фикр мекунем, ки ба ғайр аз як қатор codeҳои иловагӣ чизҳои хуб овард: 1. Мо метавонем мантиқи тиҷоратиро бидуни тағир додани an objectҳо дар пойгоҳи додаҳо иҷро кунем (биёед, хуб, ба мо лозим нест, ки майдонҳо дар бораи бастабандӣ ва нархи фурӯш дар ин ҷадвал). Картошка ҳатто бидуни бастабандӣ бо тамғаи нарх дар нигоҳдорӣ хуб нигоҳ дошта мешавад, онҳо дар он ҷо ҳатто зиёдатӣ ҳастанд. 2. Дар ин сатр List<ProductDto> productDtos = productService.findAll() мо кэши an objectҳоеро сохтем, ки барои кор бо онҳо дар доираи мантиқи тиҷорат қулайанд. Ин аст, ки агар мо як қисми молро дар паси мағоза ҷойгир кунем. 3. Ин ба мо имкон дод, ки ду амали тиҷорӣ анҷом диҳем: бастабандӣ ва аломатгузорӣ, аммо мо ба базаи маълумот танҳо як маротиба дархост кардем (дархостҳо ба базаи маълумотҳо аз нигоҳи иҷроиш хеле душвор аст). Шумо метавонед маҳсулотро бастабандӣ кунед, нархро дар он ҷойгир кунед ва онро ба намоиш гузоред - тадриҷан онро аз утоқи хидматрасонӣ гиред, на аз паси он ҳар дафъа ба анбор. Ба саволи: "Чаро ин қадар душвор аст?", одамон низ кӯшиш мекунанд, ки ҷавоб пайдо кунанд, хонед . Мақолаи навбатӣ
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION