JavaRush /جاوا بلاگ /Random-UR /بہار خوفناک نہیں ہے، ایک DTO پرت ہے۔

بہار خوفناک نہیں ہے، ایک DTO پرت ہے۔

گروپ میں شائع ہوا۔
آرٹیکل سائیکل کے مشمولات ہم بہار کے بارے میں بات کرتے رہتے ہیں۔ آج ہم DTO پیٹرن کا تجزیہ کریں گے، سمجھنے کے لیے آپ یہاں پڑھ سکتے ہیں ۔ ڈی ٹی او کے بارے میں سب سے مشکل چیز یہ سمجھنا ہے کہ اس کی ضرورت کیوں ہے۔ آئیے سبزیوں پر قیاس آرائیاں شروع کرتے ہیں، اور ساتھ ہی کچھ کوڈ لکھیں، شاید راستے میں کچھ واضح ہوجائے۔ اسپرنگ بوٹ پروجیکٹ بنائیں، h2 اور Lombok کو جوڑیں ۔ پیکجز بنائیں: ادارے، ذخیرے، خدمات، استعمال۔ اداروں میں، ایک پروڈکٹ ہستی بنائیں:
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، name= "آلو"، خریداری کی قیمت = 20] [Id =2، name= "Carrots"، purchasePrice = 14] مہذب قیاس آرائی کرنے والوں کے طور پر، ہمیں اپنے سامان کو منافع کے ساتھ بیچنا چاہیے، اس کے لیے آئیے اسے خوبصورتی سے پیک کریں اور ہم قیمت بڑھا دیں گے۔ یعنی، ہمارے پاس گندی اور ناگوار سبزیاں ایک ڈھیر میں ڈھیر تھیں، لیکن لگژری طبقے سے کلین پریمیم ویگن مصنوعات ہوں گی۔ متفق ہوں، یہ اب وہی پروڈکٹ (آبجیکٹ) نہیں رہے گا جسے ہم نے بلک میں خریدا تھا۔ ایک نئی پروڈکٹ کے لیے، ایک 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 آبجیکٹ میں بالکل وہی متغیرات ہوسکتے ہیں جو ہستی کے ہیں، یا ان میں سے زیادہ یا کم ہوسکتے ہیں۔ ہمیں یاد ہے کہ ایک چیز کو دوسری چیز میں تبدیل کرنا نقشہ سازی کا معاملہ ہے۔ 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;
    }
}
ہم صرف ایک آبجیکٹ کے فیلڈز کو دوسرے آبجیکٹ سے ملتے جلتے فیلڈز سے بھرتے ہیں۔ پروڈکٹ سروس کلاس میں ہم کسی ایک پروڈکٹ یا پروڈکٹس کی فہرست کو تلاش کرنے کے طریقے نافذ کرتے ہیں، لیکن اس سے پہلے ہم اوپر لکھا ہوا طریقہ استعمال کرتے ہوئے ہستی کو ڈی ٹی او میں تبدیل کرتے ہیں۔
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);
}
آؤٹ پٹ یہ ہے: اسٹور ڈسپلے ProductDto(id=1, name=Potatoes, purchasePrice=20, packaging=null, salePrice=null) ProductDto(id=2, name=Carrots, purchasePrice=14, packaging=null, 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);
}
ہم انجام دیتے ہیں: اسٹور ڈسپلے ProductDto(id=1, name=Potatoes, purchasePrice=20, packaging=Packed in the best way, salePrice=100) ProductDto(id=2, name=Carrots, purchasePrice=14, packaging=Packed بہترین ممکنہ طریقے سے، سیل پرائس = 70) پروڈکٹ کو خوبصورتی سے پیک کیا گیا ہے، قیمت بھی ہے، لیکن کیا آپ نے کہیں کھڑکی پر وہ قیمت دکھائی ہے جس کے لیے آپ نے اسے بلک میں خریدا ہے اور کوئی اور آئی ڈی۔ ہم ایک فائل کے ساتھ اوپر لکھے گئے کوڈ میں ترمیم کرتے ہیں:
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()
    ));
}
کلاس 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 ایک اور چیز! اب ہم سوچتے ہیں کہ dto اچھی چیزیں لے کر آیا ہے، سوائے اضافی کوڈ کے ایک گروپ کے: 1. ہم ڈیٹا بیس میں اشیاء کو تبدیل کیے بغیر کاروباری منطق انجام دے سکتے ہیں (آئیے، ٹھیک ہے، ہمیں پیکیجنگ اور فروخت کی قیمت کے بارے میں فیلڈز کی ضرورت نہیں ہے یہ میز)۔ آلو سٹوریج میں اچھی طرح سے چلیں گے یہاں تک کہ قیمت کے ٹیگ کے ساتھ پیکنگ کے بغیر، وہ وہاں ضرورت سے زیادہ ہیں۔ 2. اس لائن میں List<ProductDto> productDtos = productService.findAll() ہم نے اشیاء کا ایک ذخیرہ بنایا ہے جو کاروباری منطق کے ساتھ کام کرنے کے لیے آسان ہے۔ یہ ہے اگر ہم کچھ سامان اسٹور کے پچھلے کمرے میں رکھیں۔ 3. اس سے ہمیں دو کاروباری اقدامات کرنے کی اجازت ملی: پیکیجنگ اور مارک اپ، لیکن ہم نے ڈیٹا بیس سے صرف ایک بار درخواست کی (کارکردگی کے لحاظ سے ڈیٹا بیس کے سوالات کافی مشکل ہیں)۔ آپ پروڈکٹ کو پیک کر سکتے ہیں، اس پر قیمت کا ٹیگ لگا سکتے ہیں اور اسے ڈسپلے پر رکھ سکتے ہیں - اسے آہستہ آہستہ یوٹیلیٹی روم سے اٹھا سکتے ہیں، بجائے اس کے کہ اسے ہر بار اسٹوریج روم میں لے جائیں۔ سوال: "یہ اتنا مشکل کیوں ہے؟"، لوگ بھی جواب تلاش کرنے کی کوشش کرتے ہیں، پڑھیں ۔ اگلا مضمون
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION