JavaRush /جاوا بلاگ /Random-UR /مؤثر طریقے سے کیسے لکھیں (مضمون کا ترجمہ)
pena
سطح
Москва

مؤثر طریقے سے کیسے لکھیں (مضمون کا ترجمہ)

گروپ میں شائع ہوا۔
اصل مضمون یہاں ہے: http://www.javacodegeeks.com/2015/09/how-to-write-methods-effectively.html#download tutorial Published by: Andrey Redko (Andrey Redko) in Core Java (Java Core) 18 ستمبر 2015 یہ نوٹ ہماری اکیڈمی کے ایڈوانسڈ جاوا کورس کا حصہ ہے۔ یہ کورس آپ کو جاوا کو زیادہ مؤثر طریقے سے استعمال کرنے میں مدد کرنے کے لیے ڈیزائن کیا گیا ہے۔ یہاں مزید جدید موضوعات پر بات کی گئی ہے، جیسے آبجیکٹ کی تخلیق، متوازی، سیریلائزیشن، عکاسی، اور بہت کچھ۔ یہ علم جاوا کی مہارت کی بلندیوں تک آپ کے سفر کی رہنمائی کرے گا۔
کورس کے مشمولات
1. تعارف 2. طریقہ دستخط 3. طریقہ کار 4. طریقہ اوور لوڈنگ 5. طریقہ اوور رائڈنگ 6. ان لائننگ 7. تکرار 8. طریقہ حوالہ جات 9. ناقابل تبدیلی 10. طریقہ دستاویزات 11. طریقہ کے پیرامیٹرز اور واپسی کی اقدار 12. ایک طریقہ کے طور پر ضمیمہ 13 کے اندراج کا نقطہ۔ آگے کیا ہے 14۔ سورس کوڈ ڈاؤن لوڈ کرنا
1. تعارف
ٹیوٹوریل کے اس حصے میں، ہم جاوا میں طریقوں کو ڈیزائن کرنے اور لاگو کرنے سے متعلق مختلف پہلوؤں پر بات کرنے میں کچھ وقت گزارنے جا رہے ہیں۔ ٹیوٹوریل کے پچھلے حصے میں، آپ دیکھ سکتے ہیں کہ جاوا میں لکھنے کے طریقے بہت آسان ہیں، لیکن بہت سی چیزیں ایسی ہیں جو آپ کے طریقوں کو زیادہ پڑھنے کے قابل اور موثر بنا سکتی ہیں۔
2. طریقہ دستخط
جیسا کہ آپ پہلے ہی جانتے ہیں، جاوا ایک آبجیکٹ پر مبنی زبان ہے۔ بنیادی طور پر، ہر جاوا طریقہ کلاس کے کسی نہ کسی حصے سے تعلق رکھتا ہے (یا شماریاتی طریقہ کی صورت میں خود کلاس سے)۔ اس میں مرئیت (یا رسائی) کے اصول ہیں، اسے خلاصہ یا حتمی قرار دیا جا سکتا ہے، وغیرہ۔ تاہم، شاید کسی طریقہ کا سب سے اہم حصہ اس کا دستخط ہوتا ہے: واپسی کی قسم اور دلائل، نیز ہر طریقہ کے نفاذ کی جانچ شدہ مستثنیات کی فہرست جو پھینکی جا سکتی ہے (لیکن یہ حصہ ماضی میں اکثر استعمال نہیں ہوتا تھا، اور ان دنوں بھی کم ہوتا ہے۔ )۔ آئیے ایک چھوٹی سی مثال سے شروع کرتے ہیں۔ 1 public static void main( String[] args ) { 2 // Some implementation here 3 } مرکزی طریقہ صرف ایک args دلیل کے طور پر تاروں کی ایک صف لیتا ہے اور کچھ بھی واپس نہیں کرتا ہے۔ تمام طریقوں کو مرکزی کی طرح آسان بنانا بہت اچھا ہو سکتا ہے۔ لیکن حقیقت میں، طریقہ دستخط ناقابل پڑھ سکتا ہے. آئیے مندرجہ ذیل مثال پر نظر ڈالیں: 1 public void setTitleVisible( int lenght, String title, boolean visible ) { 2 // Some implementation here 3 } پہلی چیز جو آپ یہاں محسوس کرتے ہیں وہ یہ ہے کہ کنونشنز جاوا طریقہ کے ناموں میں مقامی طور پر استعمال ہوتے ہیں، جیسے کہ سیٹ ٹائٹل ویزیبل۔ نام کو اچھی طرح سے منتخب کیا گیا ہے اور یہ بتانے کی کوشش کرتا ہے کہ طریقہ کار کیا کرنا ہے۔ دوسرا، دلائل کے نام بتاتے ہیں (یا کم از کم اشارہ) ان کا مقصد کیا ہے۔ int i، String s، boolean f کے بجائے طریقہ کار کے دلائل کے لیے درست، بامعنی نام تلاش کرنا بہت ضروری ہے (بہت کم صورتوں میں، تاہم، یہ معنی رکھتا ہے)۔ تیسرا، طریقہ کار میں صرف تین دلائل ہیں۔ اگرچہ جاوا میں اجازت شدہ دلائل کی تعداد کی حد بہت زیادہ ہے، لیکن اس کی سختی سے سفارش کی جاتی ہے کہ 6 سے زیادہ دلائل کی تعداد سے تجاوز نہ کریں۔ اس حد سے آگے جانے سے دستخط کو سمجھنا مشکل ہو جاتا ہے۔ چونکہ جاوا 5 جاری کیا گیا تھا، طریقوں میں ایک ہی قسم کے دلائل کی مختلف فہرستیں ہو سکتی ہیں (جسے ورارگز کہتے ہیں) اور خاص نحو کا استعمال کر سکتے ہیں، جیسے: 1 public void find( String … elements ) { 2 // Some implementation here 3 } اندرونی طور پر، جاوا کمپائلر متغیر دلائل کو مناسب اقسام کی صف میں تبدیل کرتا ہے اور اس طرح متغیر دلائل ہو سکتے ہیں۔ طریقہ کار کو نافذ کرنے کے لیے اختیار کیا گیا ہے۔ دلچسپ بات یہ ہے کہ جاوا آپ کو عام پیرامیٹرز کا استعمال کرتے ہوئے varargs کا اعلان کرنے کی بھی اجازت دیتا ہے۔ تاہم، کیونکہ دلیل کی قسم نامعلوم ہے، جاوا کمپائلر اس بات کو یقینی بنانا چاہتا ہے کہ varargs درست طریقے سے استعمال ہوئے ہیں اور حتمی طریقوں کو @SafeVarargs کے ساتھ تشریح کرنے کا مشورہ دیتے ہیں (مزید معلومات کے لیے ٹیوٹوریل کا حصہ 5 دیکھیں، کیسے اور کب استعمال کیا جائے) شماریات اور تشریحات۔ ہم شماریات اور تبصرے استعمال کرتے ہیں) مثال کے طور پر: 1 @SafeVarargs 2 final public< T > void find( T ... elements ) { 3 // Some implementation here 4 } Другой ближайший путь это использовать @SuppressWarnings комментарии, например 1 @SuppressWarnings( "unchecked" ) 2 public< T > void findSuppressed( T ... elements ) { 3 // Some implementation here 4 } Следующий пример демонстрирует использование проверки исключений How части сигнатуры метода. В недалеком прошлом проверка исключений показала себя не настолько полезной, Howой она предполагалась быть, в результате шаблонный code был использован скорее для записи, чем для решения проблем. 1 public void write( File file ) throws IOException { 2 // Some implementation here 3 } Последнее, но, тем не менее, важное, How правило, рекомендуется (но редко используется), отметить аргументы метода, How final. Это поможет избавиться от практики написания плохого codeа, когда аргументы метода предназначены различным значениям. Кроме того, такие аргументы метода могут быть использованы анонимными классами (подробнее об анонимных классов рассматривается в части 3 учебника, , How to design Classes and Interfaces (Как проектировать Классы и Интерфейсы)), хотя Java 8 облегчила немного это ограничение путем введения эффективных final переменных.
3. Тело метода
Каждый метод имеет свою реализацию и цель существования. Однако, имеется пара общих рекомендаций которые реально помогают написанию ясных и понятных методов. Вероятно, наиболее важный принцип - это принцип единичной ответственности: нужно пытаться реализовать метод таким путем, чтобы каждый единичный метод делал что-то одно, и делал это хорошо. Следуя этому принципу возможно раздувание количества методов класса, и важно найти правильный баланс. Другая важная вещь в процессе codeирования и проектирования - это делать реализуемые методы короткими. Для коротких методов легко понять причину, по которой они сделаны, плюс они обычно умещаются на экран, и таким образом могут быть очень быстро поняты читателем вашего codeа. Последний по порядку (но не по значению) совет связан с использованием return операторов. Если метод возвращает некоторое meaning, пытайтесь минимизировать число мест, где return meaning было бы вызвано (некоторые люди идут даже дальше и рекомендуют использовать лишь единичное return meaning во всех случаях. Чем больше return значений имеет метод, тем более тяжело становится следовать его логике и модифицировать (or оптимизировать) реализацию.
4. Перегрузка метода
Техника перегрузки методов часто используется, чтобы обеспечить специализацию версий метода для различных типов аргументов or их комбинаций. Хотя Name метода одинаковое компьютер выбирает правильную альтернативу, углубляясь в текущие значения аргументов в точке вызова (лучший пример перегрузки это конструкторы Java: Name всегда одинаковое, но аргументы разные) or вызывает ошибку компилятора, если такой вариант метода не найден. Например: 1 public String numberToString( Long number ) { 2 return Long.toString( number ); 3 } 4 5 public String numberToString( BigDecimal number ) { 6 return number.toString(); 7 } Перегрузка метода отчасти близка к дженерикам (больше информации о дженериках можно найти в части 4 учебника How and when to use Generics (Как и когда использовать дженерики)), однако перегрузка используется в случае, где подход с использованием дженериков не работает хорошо и каждый or большинство типов аргументов, которые являются дженериками, требуют своих собственных специализированных реализаций. Тем не менее, комбинируя оба способа дженерики и перегрузку можно быть очень производительным, но часто это невозможно в Java, потому что тип стирается (больше информации в части 4 учебника How and when to use Generics (Как и когда использовать дженерики)). Давайте взглянем на пример: 1 public< T extends Number > String numberToString( T number ) { 2 return number.toString(); 3 } 4 5 public String numberToString( BigDecimal number ) { 6 return number.toPlainString(); 7 } Хотя этот кусок codeа мог быть написан без использования дженериков, это неважно для наших демонстрационных целей. Интересно, что метод numberToString перегружен специальной реализацией BigDecimal и version на дженериках предназначена для всех остальных чисел.
5. Переопределение метода
Мы много говорor о переопределении методов в части 3 учебника (How to design Classes and Interfaces (Как проектировать классы и интерфейсы). В этом разделе, когда мы уже знаем о перегрузке методов, мы собираемся показать, почему использование @Override аннотации так важно. Наш пример продемонстрирует тонкое различие между переопределением метода и перегрузкой метода в простой иерархии классов. 1 public class Parent { 2 public Object toObject( Number number ) { 3 return number.toString(); 4 } 5 } Родительский класс имеет только один метод toObject. Давайте создадим подкласс этого класса и попытаемся придумать версию метода преобразования чисел в строки (instead of необработанных an objectов). 1 public class Child extends Parent { 2 @Override 3 public String toObject( Number number ) { 4 return number.toString(); 5 } 6 } Тем не менее, сигнатура метода toObject в дочернем классе немногим отличается (см Covariant method return types (Ковариантные типы возвращаемые методами) для более подробной информации), и это делает переопределение его из суперкласса в свой класс, при этом компилятор Java не выдает ниHowих ошибок и предупреждений. Теперь, давайте добавим еще один метод к дочернему классу. 1 public class Child extends Parent { 2 public String toObject( Double number ) { 3 return number.toString(); 4 } 5 } Опять же, есть только небольшая разница в сигнатуре метода (Double instead of Number), но то, что в данном случае это перегруженная version метода, не отменяет переопределения метода родителя. То есть, когда подсказка от компилятора Java и @Override аннотации перекрываются: метод с аннотацией из последнего примера с @Override вызовет ошибку компилятора.
6. Встраивание
Встраивание - это оптимизация, осуществляемая с помощью Java JIT (точно в срок) компилятора для того, чтобы устранить конкретный вызов метода и заменить его непосредственно реализацией метода. Использование компилятора JIT эвристики зависит от двух вещей - How часто метод вызывается в настоящее время, а также от того, насколько он большой. Методы, которые слишком велики, не могут быть эффективно встроены. Встраивание может обеспечить значительный прирост производительности codeа и преимущество хранения методов короткими, How мы уже обсуждали в разделе Method body (Тело метода).
7. Рекурсия
Рекурсия в Java - это техника, где метод вызывает сам себя, выполняя расчеты. Например, давайте взглянем на следующий пример, который суммирует число массива: 1 public int sum( int[] numbers ) { 2 if( numbers.length == 0 ) { 3 return 0; 4 } if( numbers.length == 1 ) { 5 return numbers[ 0 ]; 6 } else { 7 return numbers[ 0 ] + sum( Arrays.copyOfRange( numbers, 1, numbers.length ) ); 8 } 9 } Это очень неэффективная реализация, однако она демонстрирует рекурсию достаточно хорошо. Существует одна хорошо известная проблема с рекурсивными методами: в зависимости, насколько глубока цепь вызовов, они могут переполнить стек и вызвать исключение StackOverflowError. Но не все так плохо, How кажется, потому что есть техника, которая может устранить переполнение стека, называемая tail call optimization (оптимизация хвоста вызова). Она может быть применена, если метод с хвостовой рекурсией (методы с хвостовой рекурсией это методы, в которых все рекурсивные вызовы это хвостовые вызовы). Например, давайте перепишем предыдущий алгоритм с использованием в хвостовой рекурсии: 01 public int sum( int initial, int[] numbers ) { 02 if( numbers.length == 0 ) { 03 return initial; 04 } if( numbers.length == 1 ) { 05 return initial + numbers[ 0 ]; 06 } else { 07 return sum( initial + numbers[ 0 ], 08 Arrays.copyOfRange( numbers, 1, numbers.length ) ); 09 } 10 } К сожалению, на данный момент компилятор Java (а также компилятор JVM JIT) не поддерживает tail call optimization хвостовую оптимизация, но все-таки это очень полезная техника, и ее надо знать и принимать во внимание, когда вы пишете рекурсивные алгоритмы в Java.
8. Ссылки методов
В Java 8 сделан огромный шаг вперед, путем введения функциональных понятий в язык Java. Основание, которое трактует методы How данные, понятие, которое не поддерживалось в языке до этого (однако, с тех пор How выпущена Java 7, JVM и стандартная библиотека Java уже были некоторые наработки, чтобы сделать это возможным). К счастью, имея ссылки методов, теперь это возможно. Ссылка статического метода: SomeClass::staticMethodName Ссылка на метод экземпляра конкретного an object: someInstance::instanceMethodName Ссылка на метод экземпляра произвольного an object определенного типа: SomeType::methodName Ссылка на конструктор: SomeClass::new Давайте взглянем на небольшой пример того, How методы могут быть использованы в качестве аргументов других методов. 01 public class MethodReference { 02 public static void println( String s ) { 03 System.out.println( s ); 04 } 05 06 public static void main( String[] args ) { 07 final Collection< String > strings = Arrays.asList( "s1", "s2", "s3" ); 08 strings.stream().forEach( MethodReference::println ); 09 } 10 } В последней строке main метод использует ссылку на println метод чтобы напечатать каждый элемент из коллекции строк в консоль, он передается в качестве аргумента другому методу, forEach.
9. Неизменность
Неизменность обращает на себя много внимания в эти дни, и Java не является исключением. Хорошо известно, что неизменности трудно добиться в Java, но это не значит, что это должно быть проигнорировано. В Java, неизменность - это все знания об изменении внутреннего состояния. В качестве примера, давайте взглянем на спецификации JavaBeans (http://docs.oracle.com/javase/tutorial/javabeans/). В ней говорится, очень ясно, что сеттеры могут изменить состояние an object, что- то до этого содержащего, и это то, что ожидает каждый разработчик Java. Тем не менее, альтернативный подход мог бы не менять состояние, а возвращать новый an object (new) каждый раз. Это не так страшно, How кажется, и новый Java 8 Date/Time API ( разработан под JSR 310: Date and Time API прикрытием) является отличным примером этого. Давайте взглянем на следующий фрагмент codeа: 1 final LocalDateTime now = LocalDateTime.now(); 2 final LocalDateTime tomorrow = now.plusHours( 24 ); 3 4 final LocalDateTime midnight = now 5 .withHour( 0 ) 6 .withMinute( 0 ) 7 .withSecond( 0 ) 8 .withNano( 0 ); Каждый вызов LocalDateTime an object, который должен изменить свое состояние возвращает новый экземпляр LocalDateTime, и держит оригинал без изменений. Это большой сдвиг в парадигме дизайна API по сравнению с старыми Calendar и Date, (которые, мягко говоря, были не очень приятны в использовании и вызвали много головной боли).
10. Документирование метода
В Java, в частности, если вы разрабатываете Howую-то библиотеку or framework, все публичные методы должны быть заdocumentированы с помощью инструмента Javadoc (http://www.oracle.com/technetwork/articles/java/index-jsp-135444.html). Строго говоря, ничего не заставляет вас делать это, но хорошая documentация помогает другим разработчикам понять, что конкретный метод делает, Howие аргументы он требует, Howовы предположения or ограничения его реализации, Howие типы исключений он вызывает и когда они возникают, Howое может быть возвращаемое meaning (если таковые имеются), а также многие другие вещи. Давайте взглянем на следующий пример: 01 /** 02 * The method parses the string argument as a signed decimal integer. 03 * The characters in the string must all be decimal digits, except 04 * that the first character may be a minus sign {@code '-'} or plus 05 * sign {@code '+'}. 06 * 07 *

An exception of type {@code NumberFormatException} is thrown if 08 * string is {@code null} or has length of zero. 09 * 10 *

Examples: 11 *

12	 * parse( "0" ) returns 0
13	 * parse( "+42") returns 42
14	 * parse( "-2" ) returns -2
15	 * parse( "string" ) throws a NumberFormatException
16	 * 
17 * 18 * @param str a {@code String} containing the {@code int} representation to be parsed 19 * @return the integer value represented by the string 20 * @exception NumberFormatException if the string does not contain a valid integer value 21 */ 22 public int parse( String str ) throws NumberFormatException { 23 return Integer.parseInt( str ); 24 }
Это довольно многословная documentация для такого простого метода How parse, но это показывает пару полезных возможностей обеспечиваемых инструментом Javadoc tool, в том числе ссылки на другие классы, образцы фрагментов и продвинутого форматирования. Вот How этот documentация методов отражается в Eclipse, одной из популярных Java IDE. Просто глядя на изображение выше, любой разработчик Java от младшего до старшего уровня может понять цель метода и надлежащим образом использовать ее.
11. Параметры метода и возвращаемые значения
Документирование ваших методов - это великая вещь, но, к сожалению, это не предупреждает случаи, когда метод называют, используя неправильные or неожиданные значения аргументов. Из-за этого, How правило, все публичные методы должны подтвердить свои аргументы и никогда не должны быть уверены, что все время при вызове будут указаны правильные значения (паттерн более известный How sanity checks (санитарная проверка)). Возвращаясь к нашему примеру из предыдущего раздела, метод parse должен выполнить проверку своего единственного аргумента, прежде чем делать что-нибудь с ним: 1 public int parse( String str ) throws NumberFormatException { 2 if( str == null ) { 3 throw new IllegalArgumentException( "String should not be null" ); 4 } 5 6 return Integer.parseInt( str ); 7 } Java имеет другой вариант выполнения проверки и sanity checks, используя assert операторы. Однако, те, которые могли быть выключены во время выполнения и могут быть не выполнены. Предпочтительно, всегда выполнять такие проверки и вызывать соответствующие исключения. Даже имея documentированные методы и проверку их аргументов, хочу сделать еще пару замечаний связанных с возвращаемыми значениями. До того How вышла Java 8, самым простым способом сказать что метод в данное время не имеет значения чтобы его возвратить было просто вернуть нуль. Вот почему Java так плохо получить исключение NullPointerException. Java 8 пытается решить этот вопрос с введением Optional < T > class. Давайте взглянем на этот пример: 1 public< T > Optional< T > find( String id ) { 2 // Some implementation here 3 } Optional < T > предоставляет много полезных методов, и fully устраняет необходимость возвращать в методе null и загрязнять везде ваш code проверками на null. Единственное исключение, вероятно, это коллекции. Всякий раз, когда метод возвращает коллекцию, всегда лучше вернуть null instead of null (и даже Optional < T >), например: 1 public< T > Collection< T > find( String id ) { 2 return Collections.emptyList(); 3 }
12. Метод How точка входа в приложение
یہاں تک کہ اگر آپ اپنی تنظیم میں ایپلیکیشنز لکھنے والے ایک سادہ ڈویلپر ہیں یا جاوا کے سب سے مشہور فریم ورک یا لائبریریوں میں سے کسی ایک میں تعاون کرنے والے ہیں، آپ کے ڈیزائن کے فیصلے اس بات میں بہت اہم کردار ادا کرتے ہیں کہ آپ کا کوڈ کیسے استعمال کیا جائے گا۔ اگرچہ API ڈیزائن کے رہنما خطوط کئی کتابوں کے قابل ہیں، ٹیوٹوریل کا یہ حصہ ان میں سے بہت سی چیزوں کا احاطہ کرتا ہے (طریقہ کس طرح API کے اندراج کا نقطہ بن جاتا ہے)، اس لیے ایک فوری جائزہ بہت مددگار ثابت ہوگا: • طریقوں اور ان کے دلائل کے لیے معنی خیز نام استعمال کریں (طریقہ) دستخط ) دلائل کی تعداد 6 سے کم رکھنے کی کوشش کریں (طریقہ دستخطوں کا سیکشن) • اپنے طریقوں کو مختصر اور پڑھنے کے قابل رکھیں (میتھڈ باڈی اور ان لائننگ سیکشن) • ہمیشہ عوامی طریقوں کو دستاویز کریں، بشمول پیشگی شرائط اور مثالیں اگر یہ سمجھ میں آتا ہے (سیکشن طریقہ دستاویزی) • ہمیشہ دلائل کی جانچ پڑتال اور سنجیدگی کی جانچ پڑتال کریں (سیکشن میتھڈ پیرامیٹرز اور ریٹرن ویلیوز) • ریٹرن ویلیوز (سیکشن میتھڈ پیرامیٹرز اور ریٹرن ویلیوز) کے طور پر null سے بچنے کی کوشش کریں • جب بھی یہ سمجھ میں آئے، غیر متغیر طریقوں کو ڈیزائن کرنے کی کوشش کریں (جو اندرونی حالت پر اثر انداز نہ ہوں، غیر متغیر سیکشن) • ان طریقوں کو چھپانے کے لیے مرئیت اور رسائی کے قواعد کا استعمال کریں جو عوامی نہیں ہونے چاہئیں (ٹیوٹوریل کا حصہ 3، کلاسز اور انٹرفیسز کو کیسے ڈیزائن کیا جائے)
13. آگے کیا ہے؟
ٹیوٹوریل کا یہ حصہ جاوا کے بارے میں ایک زبان کے طور پر کچھ کم بات کرتا ہے، اور جاوا زبان کو مؤثر طریقے سے استعمال کرنے کے بارے میں زیادہ بات کرتا ہے، خاص طور پر پڑھنے کے قابل، صاف، دستاویزی، اور موثر طریقوں سے۔ اگلے حصے میں، ہم اسی بنیادی خیال کو جاری رکھیں گے اور پروگرامنگ کے عمومی اصولوں پر بات کریں گے جو آپ کو جاوا کے بہتر ڈویلپر بننے میں مدد کرنے کے لیے بنائے گئے ہیں۔
14. سورس کوڈ ڈاؤن لوڈ کریں۔
یہ سبق اس بارے میں تھا کہ طریقوں کو مؤثر طریقے سے کیسے لکھا جائے۔ آپ سورس کوڈ یہاں سے ڈاؤن لوڈ کر سکتے ہیں:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION