Продолжаем про объектно-ориентированное программирование, ну и не ограничиваясь только им. В прошлых статьях я писал про классы , и рассказывал про концепцию ООП в целом. Сегодня рассказываю про ещё одну особенность ООП, а именно про методы (альтернативные названия — функции, процедуры). Что такое методы, зачем они нужны и каким образом они облегчают жизнь программисту — поехали!
Кратко про классы из прошлых статей
Напомню, класс — это декларативное описание некоторой сущности из реального мира. Сущность не обязательно должна иметь физическое отражение в материи. Это вполне может быть задача, процесс или вообще набор данных.
Подход объектно-ориентированного программирования заключается в том, чтобы разделить большую сущность (задачу, процесс, или набор данных) на маленькие составные части, и работать с каждой частью (задачей) отдельно. Маленькие части большой задачи в ООП — это классы. Смысл класса в том, чтобы послужить контейнером для некоторой части программной логики, объединить в себе некоторый код по набору каких-то признаков.
#2. Методы классов. Параметр self | Объектно-ориентированное программирование Python
И если класс представляет из себя контейнер с общим описанием условных границ, и обычно нужен для хранения пассивного содержимого, то метод — это специальная конструкция, описывающая активное поведение внутри класса . Как правило, это поведение как раз и позволяет классу решать какую-то часть общей задачи, для работы над которой он был создан.
Методы, функции и процедуры
Метод иногда называют функцией или процедурой. Как в различных языках, так и в различной документации по ООП, названия могут варьироваться. Но в общем и целом, это тождественные названия (не беря в расчёт отличные от ООП парадигмы).
Метод можно «вызывать», передавая ему входящую информацию (параметры, или аргументы). После того, как метод выполнит свою работу, он может «возвращать» результат своей работы тому, кто его вызвал.
Поведение метода, его предназначение, название и прочие характеристики — целиком и полностью определяются программистом который пишет программу. У классов могут быть десятки методов, а может вообще не быть методов. Каждый метод может возвращать результат своей работы, а может и не делать этого (например он может просто менять состояние класса, а потом молча завершаться). Методы могут принимать входящие аргументы, а могут не принимать их. Иначе говоря, полная вариативность и безграничная ширина творчества.
Что такое метод, на примере из жизни
Давай рассмотрим что-то более конкретное. Пускай у нас есть красивый телевизор на стене. Этот телевизор сделали некоторые инженеры, придав ему определённый вид, форму и функциональные характеристики. Иными словами, «запрограммировали» в реальности.
Так вот, физический, висящий на стене телевизор, с точки зрения программирования в парадигме ООП — это объект класса «Телевизор». Чертежи и принципиальные схемы телевизора, хранящиеся где-то там на заводе — это класс. Внутри физического телевизора есть конденсаторы, транзисторы, провода, микросхемы и матрица — это условные переменные (которые кстати тоже могут быть отдельными объектами других классов с уже своими переменными внутри).
SCRUM — метод управления проектами. Обучающий мультик для вас и ваших сотрудников!
У любого уважающего себя телевизора есть основная функция — показывать картинку. Вот это и есть метод. Для того, чтобы телевизор начал показывать картинку, мы нажимаем на кнопку включения. Это действие называется «вызов метода». Для выбора канала мы нажимаем цифру на пульте — 1, 2, 3, 4 и так далее.
Это можно рассматривать как числовой аргумент (параметр), который мы передаём в метод «посмотретьТелевизор». Помимо номера канала, метод «посмотретьТелевизор» ещё принимает цифровой сигнал с антенны в качестве дополнительного параметра. Так же, этот метод возвращает результаты своего выполнения в окружающий мир — то есть, показывает картинку. Как-то так.
Как создать метод в концепции ООП
В различных языках программирования, ключевые слова для создания методов могут отличаться. Так же, в зависимости от конкретного языка, могут использоваться несколько разных ключевых слов для объявления методов. Предлагаю рассмотреть использование методов через классику — а именно, через язык для веб-программирования PHP.
Для объявления метода в PHP используется ключевое слово function (функция) . Функция может быть объявлена как внутри класса, так и «внигде» — просто в файле с расширением .php. Вот как может выглядеть такой программный код.
function a()
echo «PREVED»!;
Далее, мы можем вызвать эту функцию через команду a()
Соответственно, при открытии страницы с таким программным кодом мы увидим надпись PREVED!
А вот другой пример — объявление метода внутри класса , и последующий вызов этого метода. Так же, для языка PHP.
class BestProgramEver
public static function a()
echo «PREVED2!»;
И последующий вызов функции a, находящейся внутри класса BestProgramEver
BestProgramEver::a();
Философия программирования — декомпозиция задачи на классы и методы
Работая над поставленной задачей, программист всегда создаёт структуру программы (а именно — разбивает задачу на составные части) . Для каждой составной части создаются собственные классы, и собственные методы внутри этих классов. Далее, создаётся связь классов друг с другом путём вызова методов внутри друг-друга, то есть через обращения друг к другу.
Например, внутри некоторого метода, расположенного в некотором классе, вызывается другой метод другого класса. Более того, внутри условного метода можно не только вызывать другие методы, но ещё и создавать объекты других классов, и многое другое.
Решая поставленную задачу, программист перекладывает своё представление о решаемой задаче на язык программного кода. В парадигме ООП — он делает это, создавая архитектуру программы из классов, методов и переменных. Иначе говоря — программист рефлексирует со своего угла обзора о том, как компьютеру нужно решать задачу. Рефлексирует, начиная от получения входящих параметров задачи, продолжая через обработку и анализ параметров, и заканчивая возвращением в окружающий мир результатов решения поставленной задачи.
В этом и есть ответ на вопрос, заданный в заголовке статьи. Секрет методов в том, чтобы разбивать одну большую задачу на множество мелких составных частей. Используя такое разбиение, делить сложную проблему на простые проблемы, и для каждой из простых проблем создавать собственный метод решения.
Иначе говоря — секрет эффективного программирования в максимальном упрощении задачи, через максимальное разделение задачи на части. Упрощай задачу через разбиение до тех пор, пока она не станет простой. Кстати, этот подход отлично работает и в жизни — практически для всех задач, которые могут быть разделены.
Такие вот логически-психологические сказки, пропущенные через сознание и угол зрения конкретного человека, имеющего профессию «программист». Статья про базовую часть ООП — по ссылке , рекомендую для тех кто пропустил вводную часть.
Источник: dzen.ru
Как писать методы эффективно (перевод статьи)
Исходная статья лежит по адресу: http://www.javacodegeeks.com/2015/09/how-to-write-methods-efficiently.html#download учебник Опубликовано: Andrey Redko ( Андреем Редько) в Core Java (Java Ядро) 18 сентября 2015г Эта заметка — часть курса Advanced Java (Продвинутый Java.) нашей академии Этот курс создан, чтобы помочь вам сделать использование Java более эффективным. Здесь обсуждаются более сложные темы, как создание объектов, распараллеливание, сериализация, рефлексия и многое другое. Эти знания будут гидом для вашего путешествия к вершинам мастерства Java.
Оглавление курса
1. Введение 2. Сигнатура методов 3. Тело метода 4. Перегрузка метода 5. Переопределение метода 6. Встраивание 7. Рекурсия 8. Ссылки метода 9. Неизменность 10. Документирование метода 11. Параметры метода и возвращаемые значения 12. Метод как точка входа в приложение 13. Что дальше 14. Загрузка исходного кода
1. Введение
В этом разделе учебника мы собираемся потратить некоторое время на обсуждение разных аспектов, связанных с проектированием и реализацией методов в Java. В предыдущей части учебника можно было убедиться,что написать методы на Java — очень просто, однако есть много вещей, которые могут сделать ваши методы более читаемыми и эффективными.
2. Сигнатуры методов
3. Тело метода
Каждый метод имеет свою реализацию и цель существования. Однако, имеется пара общих рекомендаций которые реально помогают написанию ясных и понятных методов. Вероятно, наиболее важный принцип — это принцип единичной ответственности: нужно пытаться реализовать метод таким путем, чтобы каждый единичный метод делал что-то одно, и делал это хорошо.
Следуя этому принципу возможно раздувание количества методов класса, и важно найти правильный баланс. Другая важная вещь в процессе кодирования и проектирования — это делать реализуемые методы короткими. Для коротких методов легко понять причину, по которой они сделаны, плюс они обычно умещаются на экран, и таким образом могут быть очень быстро поняты читателем вашего кода.
Последний по порядку (но не по значению) совет связан с использованием return операторов. Если метод возвращает некоторое значение, пытайтесь минимизировать число мест, где return значение было бы вызвано (некоторые люди идут даже дальше и рекомендуют использовать лишь единичное return значение во всех случаях. Чем больше return значений имеет метод, тем более тяжело становится следовать его логике и модифицировать (или оптимизировать) реализацию.
4. Перегрузка метода
Техника перегрузки методов часто используется, чтобы обеспечить специализацию версий метода для различных типов аргументов или их комбинаций. Хотя имя метода одинаковое компьютер выбирает правильную альтернативу, углубляясь в текущие значения аргументов в точке вызова (лучший пример перегрузки это конструкторы Java: имя всегда одинаковое, но аргументы разные) или вызывает ошибку компилятора, если такой вариант метода не найден.
Например: 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 (Как и когда использовать дженерики)), однако перегрузка используется в случае, где подход с использованием дженериков не работает хорошо и каждый или большинство типов аргументов, которые являются дженериками, требуют своих собственных специализированных реализаций. Тем не менее, комбинируя оба способа дженерики и перегрузку можно быть очень производительным, но часто это невозможно в Java, потому что тип стирается (больше информации в части 4 учебника How and when to use Generics (Как и когда использовать дженерики)). Давайте взглянем на пример: 1 public String numberToString( T number ) < 2 return number.toString(); 3 >4 5 public String numberToString( BigDecimal number ) < 6 return number.toPlainString(); 7 >Хотя этот кусок кода мог быть написан без использования дженериков, это неважно для наших демонстрационных целей. Интересно, что метод numberToString перегружен специальной реализацией BigDecimal и версия на дженериках предназначена для всех остальных чисел.
5. Переопределение метода
6. Встраивание
Встраивание — это оптимизация, осуществляемая с помощью Java JIT (точно в срок) компилятора для того, чтобы устранить конкретный вызов метода и заменить его непосредственно реализацией метода. Использование компилятора JIT эвристики зависит от двух вещей — как часто метод вызывается в настоящее время, а также от того, насколько он большой. Методы, которые слишком велики, не могут быть эффективно встроены. Встраивание может обеспечить значительный прирост производительности кода и преимущество хранения методов короткими, как мы уже обсуждали в разделе 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. Но не все так плохо, как кажется, потому что есть техника, которая может устранить переполнение стека, называемая 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. Основание, которое трактует методы как данные, понятие, которое не поддерживалось в языке до этого (однако, с тех пор как выпущена Java 7, JVM и стандартная библиотека Java уже были некоторые наработки, чтобы сделать это возможным). К счастью, имея ссылки методов, теперь это возможно. Ссылка статического метода: SomeClass::staticMethodName Ссылка на метод экземпляра конкретного объекта: someInstance::instanceMethodName Ссылка на метод экземпляра произвольного объекта определенного типа: SomeType::methodName Ссылка на конструктор: SomeClass::new Давайте взглянем на небольшой пример того, как методы могут быть использованы в качестве аргументов других методов. 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 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/).
В ней говорится, очень ясно, что сеттеры могут изменить состояние объекта, что- то до этого содержащего, и это то, что ожидает каждый разработчик Java. Тем не менее, альтернативный подход мог бы не менять состояние, а возвращать новый объект (new) каждый раз. Это не так страшно, как кажется, и новый Java 8 Date/Time API ( разработан под JSR 310: Date and Time API прикрытием) является отличным примером этого. Давайте взглянем на следующий фрагмент кода: 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 объекта, который должен изменить свое состояние возвращает новый экземпляр LocalDateTime, и держит оригинал без изменений. Это большой сдвиг в парадигме дизайна API по сравнению с старыми Calendar и Date, (которые, мягко говоря, были не очень приятны в использовании и вызвали много головной боли).
10. Документирование метода
An exception of type is thrown if 08 * string is or has length of zero. 09 * 10 *
12 * parse( «0» ) returns 0 13 * parse( «+42») returns 42 14 * parse( «-2» ) returns -2 15 * parse( «string» ) throws a NumberFormatException 16 *
11. Параметры метода и возвращаемые значения
Документирование ваших методов — это великая вещь, но, к сожалению, это не предупреждает случаи, когда метод называют, используя неправильные или неожиданные значения аргументов.
Из-за этого, как правило, все публичные методы должны подтвердить свои аргументы и никогда не должны быть уверены, что все время при вызове будут указаны правильные значения (паттерн более известный как 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 операторы.
Однако, те, которые могли быть выключены во время выполнения и могут быть не выполнены. Предпочтительно, всегда выполнять такие проверки и вызывать соответствующие исключения. Даже имея документированные методы и проверку их аргументов, хочу сделать еще пару замечаний связанных с возвращаемыми значениями.
До того как вышла Java 8, самым простым способом сказать что метод в данное время не имеет значения чтобы его возвратить было просто вернуть нуль. Вот почему Java так плохо получить исключение NullPointerException. Java 8 пытается решить этот вопрос с введением Optional class. Давайте взглянем на этот пример: 1 public Optional find( String id ) < 2 // Some implementation here 3 >Optional предоставляет много полезных методов, и полностью устраняет необходимость возвращать в методе null и загрязнять везде ваш код проверками на null. Единственное исключение, вероятно, это коллекции. Всякий раз, когда метод возвращает коллекцию, всегда лучше вернуть null вместо null (и даже Optional ), например: 1 public < T >Collection < T >find( String id ) < 2 return Collections.emptyList(); 3 >
12. Метод как точка входа в приложение
Даже если вы простой разработчик пишущий приложения в вашей организации или участник в одной из самых популярных Java framework or library, проектные решения, которые вы принимаете, играют очень важную роль в том, как ваш код будет использоваться. В то время как методические рекомендации проектирования API стоят нескольких книг, эта часть учебника касается многих из них (как методы становятся точкой входа в API), таким образом, краткий обзор будет очень полезен: • Используйте осмысленные имена для методов и их аргументов (Method signatures) Старайтесь, чтобы количество аргументов, чтобы быть меньше 6-ти (раздел Method signatures) • Сохраняйте ваши методы короткими и читабельными (раздел Method body и Inlining) • Всегда документируйте открытые методы, в том числе предварительных условий и примеры, если это имеет смысл (раздел Method Documentation) • Всегда выполняйте проверку аргументов и sanity checks (section Method Parameters and Return Values) • Старайтесь избежать null, как возвращаемое значения (раздел Method Parameters and Return Values) • Всякий раз, когда это имеет смысл, попробуйте проектировать неизменные методы (которые не влияют на внутреннее состояние, раздел Immutability) • Используйте правила видимости и доступности, чтобы скрыть методы, которые не должны быть публичными (часть 3 учебника, How to design Classes and Interfaces)
13. Что дальше
Эта часть учебника говорит немного меньше о Java как о языке, но больше о том, как использовать язык Java эффективно, в частности, написание читаемых, чистых, задокументированых и эффективных методов. В следующем разделе мы будем продолжать ту же основную идею и обсуждать общие принципы программирования, которые предназначены, чтобы помочь вам как разработчику Java стать лучше.
14. Загрузка исходного кода
Это был урок был посвящен тому, как эффективно писать методы. Вы можете загрузить исходный код здесь:
Источник: javarush.com
Методы исследования в курсовой работе с примерами
За несколько лет обучения в ВУЗах или СУЗах студентам не единожды приходится писать курсовые работы. В этой статье будут раскрыты основные методы исследования, которые применяются при написании курсовых работ в учебных заведениях.
Методы исследования в курсовой работе с примерами обновлено: 15 февраля, 2019
Средняя оценка 4.3 / 5. Количество оценок: 4
Поставьте вашу оценку
Сожалеем, что вы поставили низкую оценку!
Позвольте нам стать лучше!
Расскажите, как нам стать лучше?
Источник: nauchniestati.ru