- کیسے جڑیں؟
- میرے کام کی مثالیں: اس طرح کی مفید کلاس کے بارے میں جانے بغیر، میں نے اپنی
سائیکل کیبیساکھی کیسے بنائی۔ - آئیے دوسرے طریقوں کو دیکھتے ہیں جو مجھے دلچسپ لگے۔
- آئیے خلاصہ کرتے ہیں۔
0. جڑنے کا طریقہ
جو لوگ میرے ساتھ ہاتھ ملا کر چلتے ہیں وہ پہلے سے ہی Git اور Maven دونوں سے کم و بیش واقف ہیں، اس لیے مزید میں اس علم پر بھروسہ کروں گا اور اپنے آپ کو نہیں دہراؤں گا۔ ان لوگوں کے لیے جنہوں نے میرے پچھلے مضامین کو یاد کیا یا ابھی پڑھنا شروع کیا، یہاں Maven اور Git کے بارے میں مواد ہیں ۔ بلاشبہ، تعمیراتی نظام کے بغیر (Maven، Gredl)، آپ ہر چیز کو دستی طور پر بھی جوڑ سکتے ہیں، لیکن آج کل یہ پاگل پن ہے اور آپ کو یقینی طور پر ایسا کرنے کی ضرورت نہیں ہے: بہتر ہے کہ فوری طور پر ہر چیز کو صحیح طریقے سے کرنے کا طریقہ سیکھ لیں۔ لہذا، Maven کے ساتھ کام کرنے کے لیے، ہم پہلے مناسب انحصار شامل کرتے ہیں:<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${apache.common.version}</version>
</dependency>
جہاں ${apache.common.version} اس لائبریری کا ورژن ہے۔ اگلا، کچھ کلاس میں درآمد کرنے کے لیے، درآمد شامل کریں:
import org.apache.commons.lang3.StringUtils;
اور بس، یہ سب بیگ میں ہے))
1. ایک حقیقی پروجیکٹ کی مثالیں۔
- بائیں پیڈ کا طریقہ
پہلی مثال عام طور پر اب اتنی احمقانہ معلوم ہوتی ہے کہ یہ بہت اچھی بات ہے کہ میرے ساتھی StringUtils.leftPad کے بارے میں جانتے تھے اور مجھے بتایا۔ کام کیا تھا: کوڈ کو اس طرح بنایا گیا تھا کہ ڈیٹا کو تبدیل کرنا ضروری تھا اگر یہ صحیح طریقے سے نہیں پہنچتا ہے۔ یہ توقع کی جاتی تھی کہ سٹرنگ فیلڈ صرف نمبرز پر مشتمل ہونا چاہیے، یعنی اگر اس کی لمبائی 3 ہے اور اس کی قیمت 1 ہے، تو اندراج "001" ہونا چاہئے۔ یعنی، سب سے پہلے آپ کو تمام خالی جگہوں کو ہٹانے کی ضرورت ہے، اور پھر اسے زیرو سے ڈھانپنا ہوگا۔ کام کے جوہر کو واضح کرنے کے لیے مزید مثالیں: "12" -> "012" سے "1" -> "001" وغیرہ۔ میں نے کیا کیا؟ LeftPadExample کلاس میں اس کی وضاحت کی ۔ میں نے ایک طریقہ لکھا ہے جو یہ سب کرے گا:
public static String ownLeftPad(String value) {
String trimmedValue = value.trim();
if(trimmedValue.length() == value.length()) {
return value;
}
StringBuilder newValue = new StringBuilder(trimmedValue);
IntStream.rangeClosed(1, value.length() - trimmedValue.length())
.forEach(it -> newValue.insert(0, "0"));
return newValue.toString();
}
ایک بنیاد کے طور پر، میں نے یہ خیال لیا کہ ہم صرف اصل اور تراشی ہوئی قدر کے درمیان فرق حاصل کر سکتے ہیں اور اسے سامنے والے صفر سے بھر سکتے ہیں۔ ایسا کرنے کے لئے میں نے انٹ اسٹریم کو ایک ہی آپریشن n بار کرنے کے لئے استعمال کیا۔ اور یہ یقینی طور پر جانچنے کی ضرورت ہے۔ اگر میں StringUtils.leftPad طریقہ کے بارے میں پہلے سے جانتا ہوتا تو میں کیا کرسکتا تھا :
public static String apacheCommonLeftPad(String value) {
return StringUtils.leftPad(value.trim(), value.length(), "0");
}
جیسا کہ آپ دیکھ سکتے ہیں، بہت کم کوڈ ہے، اور ہر ایک کی طرف سے تصدیق شدہ لائبریری بھی استعمال ہوتی ہے۔ اس مقصد کے لیے، میں نے LeftPadExampleTest کلاس میں دو ٹیسٹ بنائے ہیں (عام طور پر جب وہ کسی کلاس کو ٹیسٹ کرنے کا ارادہ رکھتے ہیں، تو وہ اسی نام کے ساتھ ایک کلاس بناتے ہیں + اسی پیکیج میں ٹیسٹ، صرف src/test/java میں)۔ یہ ٹیسٹ ایک طریقہ چیک کرتے ہیں تاکہ یہ یقینی بنایا جا سکے کہ یہ صحیح طریقے سے قدر کو تبدیل کرتا ہے، پھر دوسرا۔ بلاشبہ، بہت زیادہ ٹیسٹ لکھنے کی ضرورت ہوگی، لیکن ٹیسٹنگ ہمارے معاملے میں اہم موضوع نہیں ہے:
package com.github.javarushcommunity.stringutilsdemo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@DisplayName("Unit-level testing for LeftPadExample")
class LeftPadExampleTest {
@DisplayName("Should transform by using ownLeftPad method as expected")
@Test
public void shouldTransformOwnLeftPadAsExpected() {
//given
String value = "1 ";
String expectedTransformedValue = "0001";
//when
String transformedValue = LeftPadExample.ownLeftPad(value);
//then
Assertions.assertEquals(expectedTransformedValue, transformedValue);
}
@DisplayName("Should transform by using StringUtils method as expected")
@Test
public void shouldTransformStringUtilsLeftPadAsExpected() {
//given
String value = "1 ";
String expectedTransformedValue = "0001";
//when
String transformedValue = LeftPadExample.apacheCommonLeftPad(value);
//then
Assertions.assertEquals(expectedTransformedValue, transformedValue);
}
}
میں ابھی ٹیسٹوں کے بارے میں کچھ تبصرے کر سکتا ہوں۔ وہ JUnit 5 کا استعمال کرتے ہوئے لکھے گئے ہیں:
- ایک ٹیسٹ کو ٹیسٹ کے طور پر سمجھا جائے گا اگر اس میں مناسب تشریح ہے - @Test۔
- اگر نام میں ٹیسٹ کے عمل کو بیان کرنا مشکل ہو یا تفصیل لمبی اور پڑھنے میں تکلیف نہ ہو، تو آپ @DisplayName تشریح شامل کر سکتے ہیں اور اسے ایک عام تفصیل بنا سکتے ہیں جو ٹیسٹ چلانے کے دوران نظر آئے گی۔
- ٹیسٹ لکھتے وقت، میں BDD اپروچ استعمال کرتا ہوں، جس میں میں ٹیسٹ کو منطقی حصوں میں تقسیم کرتا ہوں:
- // دیا گیا - ٹیسٹ سے پہلے ڈیٹا سیٹ اپ بلاک؛
- // وہ بلاک کب ہے جہاں کوڈ کا وہ حصہ جس کی ہم جانچ کر رہے ہیں لانچ کیا جاتا ہے۔
- // پھر ایک بلاک ہے جس میں جب بلاک کے نتائج کی جانچ پڑتال کی جاتی ہے۔
- stripStart طریقہ
یہاں مجھے ایک لائن کے ساتھ ایک مسئلہ حل کرنے کی ضرورت ہے جس میں شروع میں خالی جگہیں اور کوما ہوسکتے ہیں۔ تبدیلی کے بعد ان کا کوئی نیا مطلب نہیں ہونا چاہیے تھا۔ مسئلہ کا بیان پہلے سے کہیں زیادہ واضح ہے۔ چند مثالیں ہماری سمجھ کو تقویت دیں گی: “, , books” -> “books” “,,, books” -> “books” b , books” -> “b , books” جیسا کہ لیفٹ پیڈ کے معاملے میں ہے، میں نے StrimStartExample کلاس ، جس میں دو طریقے ہیں۔ ایک - اس کے اپنے حل کے ساتھ:
public static String ownStripStart(String value) {
int index = 0;
List commaSpace = asList(" ", ",");
for (int i = 0; i < value.length(); i++) {
if (commaSpace.contains(String.valueOf(value.charAt(i)))) {
index++;
} else {
break;
}
}
return value.substring(index);
}
یہاں خیال یہ تھا کہ اس انڈیکس کو تلاش کیا جائے جہاں سے مزید خالی جگہیں یا کوما نہیں ہیں۔ اگر وہ شروع میں بالکل نہیں تھے، تو انڈیکس صفر ہو جائے گا۔ اور دوسرا - StringUtils کے ذریعے حل کے ساتھ :
public static String apacheCommonLeftPad(String value) {
return StringUtils.stripStart(value, StringUtils.SPACE + COMMA);
}
یہاں ہم پہلی دلیل کی معلومات پاس کرتے ہیں جس کے بارے میں ہم کس سٹرنگ کے ساتھ کام کر رہے ہیں، اور دوسرے میں ہم ایک سٹرنگ پاس کرتے ہیں جس میں حروف شامل ہیں جنہیں چھوڑنا ضروری ہے۔ ہم StripStartExampleTest کلاس اسی طرح بناتے ہیں :
package com.github.javarushcommunity.stringutilsdemo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("Unit-level testing for StripStartExample")
class StripStartExampleTest {
@DisplayName("Should transform by using stripStart method as expected")
@Test
public void shouldTransformOwnStripStartAsExpected() {
//given
String value = ", , books";
String expectedTransformedValue = "books";
//when
String transformedValue = StripStartExample.ownStripStart(value);
//then
Assertions.assertEquals(expectedTransformedValue, transformedValue);
}
@DisplayName("Should transform by using StringUtils method as expected")
@Test
public void shouldTransformStringUtilsStripStartAsExpected() {
//given
String value = ", , books";
String expectedTransformedValue = "books";
//when
String transformedValue = StripStartExample.apacheCommonLeftPad(value);
//then
Assertions.assertEquals(expectedTransformedValue, transformedValue);
}
}
- خالی طریقہ ہے
یقیناً یہ طریقہ بہت آسان ہے، لیکن یہ اسے کم مفید نہیں بناتا۔ یہ String.isEmpty() طریقہ کی صلاحیتوں کو بڑھاتا ہے ، جو null کے لیے ایک چیک بھی شامل کرتا ہے۔ کس لیے؟ NullPointerException سے بچنے کے لیے، یعنی کسی متغیر پر کال کرنے کے طریقوں سے بچنا جو null ہے ۔ لہذا، نہ لکھنے کے لئے:
if(value != null && value.isEmpty()) {
//doing something
}
آپ آسانی سے یہ کر سکتے ہیں:
if(StringUtils.isEmpty(value)) {
//doing something
}
اس طریقہ کار کا فائدہ یہ ہے کہ یہ فوری طور پر واضح ہوجاتا ہے کہ کون سا طریقہ استعمال کیا گیا ہے۔
2. StringUtils کلاس کے دیگر طریقوں کا تجزیہ
اب بات کرتے ہیں ان طریقوں کے بارے میں جو میری رائے میں بھی توجہ کے مستحق ہیں۔ عام طور پر StringUtils کے بارے میں بات کرتے ہوئے، یہ کہنا ضروری ہے کہ یہ سٹرنگ کلاس میں پائے جانے والے null محفوظ طریقے فراہم کرتا ہے (جیسا کہ isEmpty طریقہ کا معاملہ ہے )۔ آئیے ان کے ذریعے چلتے ہیں:
- طریقہ کا موازنہ کریں
اس طرح کا طریقہ String میں موجود ہے اور NullPointerException پھینک دے گا اگر، دو تاروں کا موازنہ کرتے وقت، ان میں سے ایک null ہے۔ اپنے کوڈ میں بدصورت چیک سے بچنے کے لیے، ہم StringUtils.compare(String str1, String str2) طریقہ استعمال کر سکتے ہیں : یہ موازنہ کے نتیجے میں ایک int واپس کرتا ہے۔ ان اقدار کا کیا مطلب ہے؟ int = 0 اگر وہ ایک جیسے ہیں (یا دونوں کالعدم ہیں)۔ int <0، اگر str1 str2 سے کم ہے۔ int > 0، اگر str1 str2 سے بڑا ہے۔ اس کے علاوہ، اگر آپ ان کی دستاویزات کو دیکھیں تو، اس طریقہ کار کا Javadoc مندرجہ ذیل منظرنامے پیش کرتا ہے:
StringUtils.compare(null, null) = 0
StringUtils.compare(null , "a") < 0
StringUtils.compare("a", null) > 0
StringUtils.compare("abc", "abc") = 0
StringUtils.compare("a", "b") < 0
StringUtils.compare("b", "a") > 0
StringUtils.compare("a", "B") > 0
StringUtils.compare("ab", "abc") < 0
- پر مشتمل ہے... طریقے
یہاں یوٹیلیٹی ڈویلپرز نے ایک دھماکہ کیا۔ آپ جو بھی طریقہ چاہتے ہیں وہ موجود ہے۔ میں نے انہیں ایک ساتھ رکھنے کا فیصلہ کیا:
-
contains ایک طریقہ ہے جو جانچتا ہے کہ آیا متوقع سٹرنگ کسی اور سٹرنگ کے اندر ہے۔ یہ کس طرح مفید ہے؟ آپ یہ طریقہ استعمال کر سکتے ہیں اگر آپ کو یہ یقینی بنانا ہو کہ متن میں کوئی خاص لفظ موجود ہے۔
مثالیں:
StringUtils.contains(null, *) = false StringUtils.contains(*, null) = false StringUtils.contains("", "") = true StringUtils.contains("abc", "") = true StringUtils.contains("abc", "a") = true StringUtils.contains("abc", "z") = false
ایک بار پھر، NPE (Null Pointer Exception) سیکورٹی موجود ہے۔
containsAny ایک ایسا طریقہ ہے جو چیک کرتا ہے کہ آیا سٹرنگ میں موجود کوئی حرف موجود ہے یا نہیں۔ اس کے علاوہ ایک مفید چیز: آپ کو اکثر ایسا کرنا پڑتا ہے۔ دستاویزات سے مثالیں:
StringUtils.containsAny(null, *) = false StringUtils.containsAny("", *) = false StringUtils.containsAny(*, null) = false StringUtils.containsAny(*, []) = false StringUtils.containsAny("zzabyycdxx", ['z', 'a']) = true StringUtils.containsAny("zzabyycdxx", ['b', 'y']) = true StringUtils.containsAny("zzabyycdxx", ['z', 'y']) = true StringUtils.containsAny("aba", ['z']) = false
-
containsIgnoreCase contains طریقہ کے لیے ایک مفید توسیع ہے ۔ درحقیقت، اس طریقہ کے بغیر اس طرح کے کیس کو چیک کرنے کے لیے، آپ کو کئی آپشنز سے گزرنا پڑے گا۔ اور اس طرح صرف ایک طریقہ ہم آہنگی سے استعمال کیا جائے گا۔
-
containsNone - نام سے اندازہ لگاتے ہوئے، آپ پہلے ہی سمجھ سکتے ہیں کہ کیا چیک کیا جا رہا ہے۔ اندر کوئی لکیریں نہیں ہونی چاہئیں۔ ایک مفید چیز، یقیناً۔ کچھ ناپسندیدہ کرداروں کی فوری تلاش؛)۔ اپنے ٹیلیگرام بوٹ میں ہم فحاشی کو فلٹر کریں گے اور ان مضحکہ خیز طریقوں کو نظر انداز نہیں کریں گے۔
اور مثالیں، ہم ان کے بغیر کہاں ہوں گے:
StringUtils.containsNone(null, *) = true StringUtils.containsNone(*, null) = true StringUtils.containsNone("", *) = true StringUtils.containsNone("ab", '') = true StringUtils.containsNone("abab", 'xyz') = true StringUtils.containsNone("ab1", 'xyz') = true StringUtils.containsNone("abz", 'xyz') = false
دستاویزات سے چند مثالیں:
StringUtils.containsIgnoreCase(null, *) = false
StringUtils.containsIgnoreCase(*, null) = false
StringUtils.containsIgnoreCase("", "") = true
StringUtils.containsIgnoreCase("abc", "") = true
StringUtils.containsIgnoreCase("abc", "a") = true
StringUtils.containsIgnoreCase("abc", "z") = false
StringUtils.containsIgnoreCase("abc", "A") = true
StringUtils.containsIgnoreCase("abc", "Z") = false
- ڈیفالٹ اسٹرنگ کا طریقہ
طریقوں کا ایک سلسلہ جو اضافی معلومات شامل کرنے سے بچنے میں مدد کرتا ہے اگر سٹرنگ کالعدم ہے اور آپ کو کچھ ڈیفالٹ ویلیو سیٹ کرنے کی ضرورت ہے۔ ہر ذائقہ کے مطابق بہت سے اختیارات ہیں. ان میں سرفہرست ہے StringUtils.defaultString(final String str, final String defaultStr) - str null ہونے کی صورت میں، ہم آسانی سے ویلیو کو defaultStr میں منتقل کر دیں گے ۔ دستاویزات سے مثالیں:
StringUtils.defaultString(null, "NULL") = "NULL"
StringUtils.defaultString("", "NULL") = ""
StringUtils.defaultString("bat", "NULL") = "bat"
جب آپ ڈیٹا کے ساتھ POJO کلاس بناتے ہیں تو اسے استعمال کرنا بہت آسان ہوتا ہے۔
- وائٹ اسپیس کو حذف کرنے کا طریقہ
یہ ایک دلچسپ طریقہ ہے، اگرچہ اس کے اطلاق کے لیے بہت سے اختیارات نہیں ہیں۔ اس کے ساتھ ساتھ اگر ایسا کوئی معاملہ سامنے آتا ہے تو یقیناً یہ طریقہ بہت مفید ہوگا۔ یہ تار سے تمام خالی جگہوں کو ہٹا دیتا ہے۔ جہاں کہیں بھی یہ خلا ہے، وہاں اس کا کوئی نشان نہیں ملے گا))) دستاویزات سے مثالیں:
StringUtils.deleteWhitespace(null) = null
StringUtils.deleteWhitespace("") = ""
StringUtils.deleteWhitespace("abc") = "abc"
StringUtils.deleteWhitespace(" ab c ") = "abc"
- طریقہ کے ساتھ ختم ہوتا ہے۔
خود ہی بولتا ہے۔ یہ ایک بہت مفید طریقہ ہے: یہ چیک کرتا ہے کہ آیا سٹرنگ تجویز کردہ سٹرنگ کے ساتھ ختم ہوتی ہے یا نہیں۔ یہ اکثر ضروری ہوتا ہے۔ بلاشبہ، آپ خود چیک لکھ سکتے ہیں، لیکن ایک ریڈی میڈ طریقہ استعمال کرنا واضح طور پر زیادہ آسان اور بہتر ہے۔ مثالیں:
StringUtils.endsWith(null, null) = true
StringUtils.endsWith(null, "def") = false
StringUtils.endsWith("abcdef", null) = false
StringUtils.endsWith("abcdef", "def") = true
StringUtils.endsWith("ABCDEF", "def") = false
StringUtils.endsWith("ABCDEF", "cde") = false
StringUtils.endsWith("ABCDEF", "") = true
جیسا کہ آپ دیکھ سکتے ہیں، سب کچھ خالی لائن کے ساتھ ختم ہوتا ہے))) میرے خیال میں یہ مثال (StringUtils.endsWith("ABCDEF", "") = true) صرف ایک بونس ہے، کیونکہ یہ مضحکہ خیز ہے) ایک طریقہ بھی ہے جو کیس کو نظر انداز کرتا ہے.
- مساوی طریقہ
کالعدم محفوظ طریقہ کی ایک عمدہ مثال جو دو تاروں کا موازنہ کرتی ہے۔ ہم وہاں جو کچھ بھی ڈالیں گے، جواب وہیں ہوگا، اور یہ غلطیوں کے بغیر ہوگا۔ مثالیں:
StringUtils.equals(null, null) = true
StringUtils.equals(null, "abc") = false
StringUtils.equals("abc", null) = false
StringUtils.equals("abc", "abc") = true
StringUtils.equals("abc", "ABC") = false
بلاشبہ، یہاں بھی ہے equalsIgnoreCase - سب کچھ بالکل اسی طرح کیا جاتا ہے، صرف ہم اس معاملے کو نظر انداز کرتے ہیں۔ چلو دیکھتے ہیں؟
StringUtils.equalsIgnoreCase(null, null) = true
StringUtils.equalsIgnoreCase(null, "abc") = false
StringUtils.equalsIgnoreCase("abc", null) = false
StringUtils.equalsIgnoreCase("abc", "abc") = true
StringUtils.equalsIgnoreCase("abc", "ABC") = true
- کسی بھی طریقے کے برابر ہے۔
آئیے آگے بڑھیں اور مساوی طریقہ کو بڑھاتے ہیں ۔ آئیے کہتے ہیں کہ متعدد مساوات کی جانچ کے بجائے، ہم ایک کو انجام دینا چاہتے ہیں۔ اس کے لیے، ہم ایک سٹرنگ پاس کر سکتے ہیں جس کے ساتھ سٹرنگز کے سیٹ کا موازنہ کیا جائے گا؛ اگر ان میں سے کوئی بھی مجوزہ کے برابر ہے، تو یہ سچ ہوگا۔ ہم ایک سٹرنگ اور سٹرنگز کا ایک مجموعہ پاس کرتے ہیں تاکہ ان کا ایک دوسرے سے موازنہ کیا جا سکے (مجموعہ کے تاروں کے ساتھ پہلی سٹرنگ)۔ مشکل؟ یہ سمجھنے میں آپ کی مدد کرنے کے لیے دستاویزات کی مثالیں ہیں کہ کیا مطلب ہے:
StringUtils.equalsAny(null, (CharSequence[]) null) = false
StringUtils.equalsAny(null, null, null) = true
StringUtils.equalsAny(null, "abc", "def") = false
StringUtils.equalsAny("abc", null, "def") = false
StringUtils.equalsAny("abc", "abc", "def") = true
StringUtils.equalsAny("abc", "ABC", "DEF") = false
یہاں بھی ہے equalsAnyIgnoreCase ۔ اور اس کی مثالیں:
StringUtils.equalsAnyIgnoreCase(null, (CharSequence[]) null) = false
StringUtils.equalsAnyIgnoreCase(null, null, null) = true
StringUtils.equalsAnyIgnoreCase(null, "abc", "def") = false
StringUtils.equalsAnyIgnoreCase("abc", null, "def") = false
StringUtils.equalsAnyIgnoreCase("abc", "abc", "def") = true
StringUtils.equalsAnyIgnoreCase("abc", "ABC", "DEF") = true
GO TO FULL VERSION