paint-brush
ব্যবহার-সাইট টার্গেট নিয়ে কাজ করার সময় Kotln সমস্যাগুলি কীভাবে ঠিক করবেনদ্বারা@jesperancinha
106 পড়া

ব্যবহার-সাইট টার্গেট নিয়ে কাজ করার সময় Kotln সমস্যাগুলি কীভাবে ঠিক করবেন

দ্বারা João Esperancinha10m2024/03/21
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

কেন এবং কোথায় আমরা কোটলিনে ইউজ-সাইট টার্গেটগুলি ব্যবহার করব এবং স্প্রিং ফ্রেমওয়ার্কের মতো ফ্রেমওয়ার্ক ব্যবহার করার সময় কোটলিনে এটি কীভাবে আলাদা।
featured image - ব্যবহার-সাইট টার্গেট নিয়ে কাজ করার সময় Kotln সমস্যাগুলি কীভাবে ঠিক করবেন
João Esperancinha HackerNoon profile picture
0-item
1-item
2-item
3-item


কোটলিনের অন্যতম শক্তিশালী পয়েন্ট এর দুর্বলতাও হতে পারে। যখন আমরা আজকে ডাটা ক্লাসের কথা বলি, এবং একইভাবে জাভা রেকর্ড করে, তখন আমরা ফোকাস করার প্রবণতা রাখি, অন্তত আমার পরিচিত অনেক লোকই বয়লারপ্লেট কোডের সম্পূর্ণ নির্মূলের দিকে মনোযোগ দেয়। বয়লারপ্লেট কোড এমন কিছু যা যুগ যুগ ধরে ডেভেলপারদের বিরক্তিকর করে আসছে। এটি কেবল জাভাতেই বিদ্যমান নয়, অন্যান্য ভাষায়ও এটি রয়েছে। যদি আমরা ডেটা অ্যাক্সেস অবজেক্টগুলি যে কোনও উপায়ে তৈরি করার বিষয়ে চিন্তা করি, তাহলে আমরা এটি কোটলিন বা জাভা বা অন্য কোনও ভাষায় করি কিনা তা সত্যিই কোন ব্যাপার না।


প্রায়শই আমরা একই প্রক্রিয়া পুনরাবৃত্তি করি: সংগ্রহস্থল তৈরি, পরিষেবা এবং নিয়ামক। আমরা যা করি তার অনেকটাই বয়লারপ্লেট এখনও যে কোনও উপায়ে। যদিও বয়লারপ্লেট কোড ডাটা ক্লাস বা জাভা রেকর্ড তৈরি করার সিদ্ধান্তের একটি অংশ হতে পারে, সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের আরও গুরুত্বপূর্ণ দৃষ্টান্ত ছিল এই ধরনের ডেটা স্ট্রাকচার তৈরির আসল কেন্দ্রবিন্দু।


এটি সবই অপরিবর্তনীয়তা বা যে কোনও ক্ষেত্রে এর সম্ভাবনার জন্য ফোঁড়া। আসুন সময়টি রোলব্যাক করি এবং 1995-এ ফিরে যাই যেখানে আমরা কিছু সময়ে ডেটা স্ট্রাকচার তৈরি করতে শুরু করেছি যেখানে আমরা বিভিন্ন জিনিস নির্দিষ্ট করব। আমরা ক্ষেত্র, গেটার, সেটার, বৈশিষ্ট্য, অ্যাক্সেসর, অ্যাট্রিবিউট এবং প্যারামিটারগুলিকে এমনভাবে সংজ্ঞায়িত করব যাতে আমাদের আর্গুমেন্টগুলি পদ্ধতি, ফাংশন বা কন্ট্রাক্টরগুলির কাছে পাস করতে সক্ষম হয়৷ এই অংশে আমাদের থাকবে 80 এর দশকের মাঝামাঝি সিরিজের চরিত্রগুলি ব্যবহার করে কিছু মজার প্রোগ্রামিং: দ্য গোল্ডেন গার্লস। এটি বলার পরে, আসুন দেখি প্রায় 15 বছর ধরে একটি ক্লাস কেমন হবে:


 public class GoldenGirlsJava { public String goldenGirl1; private final String goldenGirl2; private final String goldenGirl3; private final String goldenGirl4; public GoldenGirlsJava() { this.goldenGirl1 = "Dorothy Zbornak"; this.goldenGirl2 = "Rose Nylund"; this.goldenGirl3 = "Blanche Devereaux"; this.goldenGirl4 = "Sophia Petrillo"; } public GoldenGirlsJava( String goldenGirl1, String goldenGirl2, String goldenGirl3, String goldenGirl4 ) { this.goldenGirl1 = goldenGirl1; this.goldenGirl2 = goldenGirl2; this.goldenGirl3 = goldenGirl3; this.goldenGirl4 = goldenGirl4; } public String getGoldenGirl1() { return goldenGirl1; } public void setGoldenGirl1(String goldenGirl1) { this.goldenGirl1 = goldenGirl1; } public String getGoldenGirl2() { return goldenGirl2; } public String getGoldenGirl3() { return goldenGirl3; } public String getGoldenGirl4() { return goldenGirl4; } @Override public String toString() { return "GoldenGirlsJava{" + "goldenGirl1='" + goldenGirl1 + '\'' + ", goldenGirl2='" + goldenGirl2 + '\'' + ", goldenGirl3='" + goldenGirl3 + '\'' + ", goldenGirl4='" + goldenGirl4 + '\'' + '}'; } }


এটি শুধুমাত্র দুটি কন্ট্রাক্টর তৈরি করতে টাইপ করার জন্য প্রচুর পরিমাণে কোড ছিল। যদিও হ্যাশকোড এবং ইক্যুয়ালগুলি সমস্ত অনুষ্ঠানে অপরিহার্য ছিল না, তবে আমাদের প্রায় সবসময়ই আরও সাধারণ কনস্ট্রাক্টরের পাশে একটি নো আর্গুমেন্ট কন্ট্রাক্টর প্রয়োগ করতে হয়েছিল। এই সমস্ত বয়লারপ্লেট কোড তৈরি করার বিষয়ে ভাল জিনিস হল যে আমরা খুব স্পষ্টভাবে জানতাম যে বাইটকোড কম্পাইল করার পরে সবকিছু কেমন হবে।


যাইহোক, এবং যাই হোক না কেন, অনেক ডেভেলপারদের জন্য বয়লারপ্লেট কোড সবসময়ই একটি বিতর্কিত সমস্যা ছিল এবং তাই 2009 সালে, লম্বক এসেছিলেন এবং আমরা ডেটা স্ট্রাকচার তৈরি করার পদ্ধতিতে বিপ্লব ঘটিয়েছি। এটি একটি টীকা প্রসেসর ব্যবহার করার এবং নির্দিষ্ট টীকা ব্যাখ্যা করার ধারণাটি চালু করেছে যা আমাদের ক্লাসের জন্য প্রয়োজনীয় গুণাবলী প্রদান করবে এবং তাই একটি লম্বক টীকাযুক্ত ক্লাস দেখতে এইরকম হবে:

 @Getter @Setter @AllArgsConstructor @ToString public class GoldenGirlsLombok { public String goldenGirl1; private final String goldenGirl2; private final String goldenGirl3; private final String goldenGirl4; public GoldenGirlsLombok() { this.goldenGirl1 = "Dorothy Zbornak"; this.goldenGirl2 = "Rose Nylund"; this.goldenGirl3 = "Blanche Devereaux"; this.goldenGirl4 = "Sophia Petrillo"; } }


এবং কিছুক্ষণের জন্য, মানুষ Lombok সম্পর্কে খুব খুশি ছিল! অবশেষে সেই সমস্ত বয়লারপ্লেট কোড তৈরি করার ওজন চলে গেল। কিন্তু সেই পতন প্রায় 7 বছর ধরে সহ্য করা হয়েছিল, যখন একজন নতুন প্লেয়ার এসেছিল এবং এই সময় এটি এমন কিছু ছিল যা সফ্টওয়্যার উন্নয়ন শিল্প আশা করেনি। এটিকে কোটলিন বলা হয় এবং 2016 সালে এটি ডাটা ক্লাসের অবিলম্বে প্রবর্তনের সাথে আত্মপ্রকাশ করে। কোটলিনে আমাদের গোল্ডেন গার্লস বাস্তবায়ন এখন এইরকম হবে:

 data class GoldenGirls( var goldenGirl1: String = "Dorothy Zbornak", private val goldenGirl2: String = "Rose Nylund", private val goldenGirl3: String = "Blanche Devereaux", private val goldenGirl4: String = "Sophia Petrillo" )


যদিও কোটলিন ধীরে ধীরে ভক্ত সংগ্রহ করতে শুরু করেছিল, অন্যদিকে জাভা বুঝতে পেরেছিল যে বাজারে অন্য কিছু রয়েছে এবং সেই দিকের কিছু উন্নয়ন প্রকল্প লুমের মতো কিছু বাষ্প লাভ করতে শুরু করেছিল যা তৈরি করা হয়েছিল কিন্তু কিছু সময়ের জন্য পিছনের বার্নারে রেখেছিল। এই কারণেই, 20202 সালে জাভা 14 প্রকাশের সাথে, জাভা জাভা রেকর্ড প্রবর্তন করেছিল এবং জাভাতে ডেটা স্ট্রাকচার এখন এইরকম দেখাবে:

 public record GoldenGirlsRecord( String goldenGirl1, String goldenGirl2, String goldenGirl3, String goldenGirl4 ) { public GoldenGirlsRecord() { this( "Dorothy Zbornak", "Rose Nylund", "Blanche Devereaux", "Sophia Petrillo" ); } }


এবং আজ অবধি কোড সরলীকরণ এবং কোড হ্রাস কেবল অব্যাহত রয়েছে বলে মনে হচ্ছে। যাইহোক, বয়লারপ্লেট কোড হ্রাসের সাথে, ক্ষেত্র, গেটার, সেটার, বৈশিষ্ট্য, অ্যাক্সেসর, বৈশিষ্ট্য এবং প্যারামিটারের ধারণাগুলি আমাদের মনে অনেক কম দৃশ্যমান এবং মানচিত্র করা কম সহজ হয়ে উঠেছে। আমরা এটি পছন্দ করি বা না করি সেই ধারণাগুলি এখনও JVM কীভাবে বাইটকোডের সাথে কোড কাজ করে এবং সংগঠিত করে৷ কিন্তু কোড ওভারসিমপ্লিফিকেশন আসলেই কোড পড়া সহজ করে তোলার বিষয়ে এবং ডেটা ক্লাস এবং জাভা রেকর্ডের ক্ষেত্রে ধারণাটি হল ডেটা স্ট্রাকচার তৈরি করা৷ যেগুলি অপরিবর্তনীয় বা আংশিকভাবে অপরিবর্তনীয়।


জাভা রেকর্ডগুলি সত্যিই অপরিবর্তনীয় এই অর্থে যে এটিতে থাকা সমস্ত মান বা রেফারেন্সগুলি সংশোধন করা যায় না। কোটলিন ডেটা ক্লাসগুলিও একই কারণে সত্যই অপরিবর্তনীয় হতে পারে তবে তাদের প্রয়োজন নেই যা কোনওভাবে বিকাশকারীদেরকে জটিল এবং সবচেয়ে খারাপ, পরিবর্তনযোগ্য কোড তৈরি করার অনুমতি দেয়৷ যে কোনও ক্ষেত্রে এটি আমাদের প্রয়োজন না হওয়া পর্যন্ত ভাল। স্প্রিং ফ্রেমওয়ার্কের মতো ফ্রেমওয়ার্কের সাথে কাজ করতে, যা টীকাগুলির উপর অনেক বেশি নির্ভর করে। এখানে একটি উদাহরণ:

 @Entity @Table(name = "shelf_case") data class Case( @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) val id: Long?, var designation: String?, var weight: Long? ) { constructor() : this(0L, null, null) override fun toString(): String { return super.toString() } }


এই উদাহরণ ভাল কাজ করে. সন্দেহাতীত চোখের কাছে, এখানে খুব বেশি বিশেষ কিছু হচ্ছে না। এটি কোটলিনে কাজ করে, ঠিক একইভাবে এটি জাভাতে কাজ করবে। কিন্তু এখন আসুন একটি অনুরূপ উদাহরণ দেখুন, কিন্তু এই সময় জ্যাকসন টীকা সহ:

 data class AccountNumbersPassiveDto( @NotNull val accountNumberLong: Long?, val accountNumberNullable: Long?, @DecimalMax(value = "10") @DecimalMin(value = "5") val accountNumber: BigDecimal, val accountNumberEven: Int, val accountNumberOdd: Int, @Positive val accountNumberPositive: Int, @Negative val accountNumberNegative: Int, @DecimalMax(value = "5", groups = [LowProfile::class]) @DecimalMax(value = "10", groups = [MiddleProfile::class]) @DecimalMax(value = "15", groups = [HighProfile::class]) @DecimalMax(value = "20") val accountNumberMaxList:Int )


এই উদাহরণটি ব্যর্থ হবে এবং এর কারণ হল যে কোটলিনে, কম্পাইলারকে বলার কোন উপায় নেই যে আমরা আমাদের টীকাটি ঠিক কোথায় প্রয়োগ করতে চাই। টীকা @Entity সহ পূর্ববর্তী উদাহরণে, যা একটি জাকার্তা স্থায়ী টীকা, টীকাগুলি সঠিকভাবে ক্ষেত্রে প্রয়োগ করা হয়েছে। যদি আমরা সেই কোডটি ডিকম্পাইল করি তাহলে আমরা এটি খুঁজে পাব:

 public final class Case { @Id @GeneratedValue( strategy = GenerationType.SEQUENCE ) @Nullable private final Long id; @Nullable private String designation; @Nullable private Long weight;


কিন্তু পরেরটির জন্য, যা একটি জাকার্তা বৈধতার উদাহরণ, আমরা এটি খুঁজে পাই:

 public final class AccountNumbersPassiveDto { @Nullable private final Long accountNumberLong; @Nullable private final Long accountNumberNullable; @NotNull private final BigDecimal accountNumber; private final int accountNumberEven; private final int accountNumberOdd;



এর অর্থ হল AccountNumbersDto এর ক্ষেত্রের সেই টীকাগুলির দ্বারা প্রভাবিত হয়নি৷ আমরা প্রথম উদাহরণে ভাগ্যবান ছিলাম। এটি আসলে ব্যর্থও হতে পারে৷ আমাদের টীকাটি কোথায় যেতে হবে তা নির্দিষ্ট করার জন্য, কোটলিন আমাদেরকে যেকোন টীকাটির উপসর্গ হিসাবে ব্যবহার-সাইট লক্ষ্যগুলি ব্যবহার করার সম্ভাবনা দেয়৷ প্রয়োজন অবশ্যই শর্ত পূরণ করা হয়. এই ক্ষেত্রে, এটি ঠিক করার একটি উপায় হল @field সহ সমস্ত টীকাকে এইভাবে উপসর্গ করা:

 data class AccountNumbersPassiveDto( @field:NotNull val accountNumberLong: Long?, val accountNumberNullable: Long?, @field:DecimalMax(value = "10") @field:DecimalMin(value = "5") val accountNumber: BigDecimal, val accountNumberEven: Int, val accountNumberOdd: Int, @field:Positive val accountNumberPositive: Int, @field:Negative val accountNumberNegative: Int, @field:DecimalMax(value = "5", groups = [LowProfile::class]) @field:DecimalMax(value = "10", groups = [MiddleProfile::class]) @field:DecimalMax(value = "15", groups = [HighProfile::class]) @field:DecimalMax(value = "20") val accountNumberMaxList:Int )


যদি আমরা এখন IntelliJ ব্যবহার করে ফলাফল বাইটকোড ডিকম্পাইল করার চেষ্টা করি, তাহলে আমরা দেখতে পাব যে এটি জাভাতে এই কোডটির ফলাফল দেয়:

 public final class AccountNumbersPassiveDto { @NotNull @Nullable private final Long accountNumberLong; @Nullable private final Long accountNumberNullable; @DecimalMax("10") @DecimalMin("5") @org.jetbrains.annotations.NotNull


এর মানে হল যে টীকাগুলি ফিল্ডে প্রয়োগ করা হয়েছে এবং আমাদের কোড যেমনটি অনুমিত হয় সেভাবে কাজ করে৷


আপনি সম্ভবত এই মুহুর্তে কল্পনা করতে পারেন যে যারা দীর্ঘদিন ধরে জাভাতে কাজ করছেন, তাদের কোটলিনের সাথে খাপ খাইয়ে নিতে কোন সমস্যা হবে না কারণ আমরা সবাই জানি ক্ষেত্র, পরামিতি, বৈশিষ্ট্য ইত্যাদি কী। আমরা আজ যা পর্যবেক্ষণ করি এবং আমিও এটির সাক্ষী, তা হল কোড সরলীকরণে ব্যাকফায়ার করার সম্ভাবনা রয়েছে বলে মনে হচ্ছে। বেশ কয়েকটি ঘটনা ঘটেছে যেখানে আমি প্রকল্পগুলিতে ব্যয় করা সময় সম্পর্কে সচেতন হয়েছি যে কেন কিছু প্রকল্প বা মডিউলগুলিতে, টীকাগুলি কাজ করছে বলে মনে হচ্ছে না। এবং এটি সব ব্যবহার-সাইট লক্ষ্যমাত্রা ব্যবহার না করার জন্য নিচে ফোঁড়া বলে মনে হচ্ছে.


সম্ভবত আমার তত্ত্বটি হল যে নতুন প্রজন্মের বিকাশকারীরা সম্ভবত এমন জিনিসগুলি দেখবে যা আমার প্রজন্ম জটিল বলে মনে করেনি এবং প্রবৃত্তি থেকে শিখেছে, সত্যিই জটিল উপাদান হিসাবে। ইউজ-সাইট টার্গেটের ক্ষেত্রেও তাই। এগুলি এমন জিনিস ছিল যা আমরা খুব সহজেই কল্পনা করতে পারি। যাইহোক, বর্তমান সময়ে, এর সাথে উত্পন্ন বিভ্রান্তি কিছু অনুষ্ঠানে সময়মতো প্রকল্পগুলি বিকাশ করতে বিলম্ব করছে বলে মনে হচ্ছে। আমি অবশ্যই সাধারণীকরণ করতে সক্ষম হব না তবে ভাল হওয়ার সম্ভাবনা রয়েছে এবং জাভা রেকর্ড এবং ডেটা ক্লাসের সাথে খারাপ হওয়ার সম্ভাবনা রয়েছে। ডেটা ক্লাস এবং রেকর্ডগুলি কীভাবে আমাদের ভবিষ্যতকে রূপ দেবে তা বলা কঠিন, তবে একটি বিষয় যা স্পষ্ট যে এই সমস্যাযুক্ত হওয়ার কারণে, অন্যান্য ফ্রেমওয়ার্কগুলি সম্পূর্ণরূপে টীকামুক্ত হওয়ার জন্য বাজি ধরছে যেমনটি Ktor এর ক্ষেত্রে।


আমি স্ক্রাইবড-এ এই বিষয়ে ডকুমেন্টেশন তৈরি করেছি: ফিল্ড-ইন-জাভা-এবং-কোটলিন-এবং-কী-প্রত্যাশিত এবং স্লাইড-শেয়ারেও: ফিল্ড-ইন-জাভা-এবং-কটলিন-এবং-কী-প্রত্যাশিত


আপনি GitHub এ আমি দেওয়া উদাহরণগুলিও খুঁজে পেতে পারেন। সোনালী মেয়েদের উদাহরণ এখানে পাওয়া যাবে: jeorg-kotlin-test-drives এবং জাকার্তার অধ্যবসায় এবং বৈধতা টীকা উদাহরণ এখানে পাওয়া যাবে: https://github.com/jesperancinha/jeorg-spring-master-test-drives


অবশেষে আমি ইউটিউবে এটি সম্পর্কে একটি ভিডিও তৈরি করেছি যা আপনি এখানে দেখতে পারেন:

এছাড়াওএখানে প্রকাশিত.