Подтвердить что ты не робот

Что означает абстракция при программировании?

Я изучаю python, и я не уверен в понимании следующего утверждения: "Функция (включая ее имя) может захватывать наше умственное разбиение или абстракцию проблемы."

Это часть, выделенная жирным шрифтом, что я не понимаю смысла в терминах программирования. Цитата взята из http://www.openbookproject.net/thinkcs/python/english3e/functions.html

Как думать, как компьютерный ученый, 3 издание.

Спасибо!

4b9b3361

Ответ 1

Абстракция является основной концепцией во всех компьютерных науках. Без абстракции мы все равно будем программировать в машинный код или, хуже того, не иметь компьютеров в первую очередь. Так ИМХО, что действительно хороший вопрос.

Что такое абстракция

Абстрактное что-то означает давать имена вещам, так что имя фиксирует ядро ​​того, что делает функция или целая программа.

Один пример приведен в книге, на которую вы ссылаетесь, где говорится

Предположим, что мы работали с черепахами, и нам нужна общая операция рисовать квадраты. "Нарисуйте квадрат" - это абстракция или ментальный кусок, из нескольких меньших шагов. Поэтому давайте напишем функцию для захвата шаблон этого "строительного блока":

Забудьте о черепах на мгновение и просто подумайте о рисовании квадрата. Если я скажу вам нарисовать квадрат (на бумаге), вы сразу же узнаете, что делать:

  • нарисуйте квадрат = > нарисуйте прямоугольник со всеми сторонами одинаковой длины.

Вы можете сделать это без дальнейших вопросов, потому что вы знаете наизусть, что такое квадрат, без чего я говорю вам шаг за шагом. Здесь слово square является абстракцией "нарисуйте прямоугольник со всеми сторонами одной длины".

Абстракции работают глубоко

Но подождите, откуда вы знаете, что такое прямоугольник? Ну, это еще одна абстракция для следующего:

  • rectangle = > нарисуйте две прямые, параллельные друг другу, одной длины, а затем добавьте еще две параллельные линии, перпендикулярные двум другим линиям, снова одной длины, но, возможно, различной длины, чем первые два.

Конечно, он продолжается, и он-лайн, параллельный, перпендикулярный, соединяющий все абстракции хорошо известных понятий.

Теперь представьте, что каждый раз, когда вы хотите, чтобы прямоугольник или квадрат рисовался, вы должны дать полное определение прямоугольника или объяснить строки, параллельные линии, перпендикулярные линии и соединительные линии. Это займет слишком много времени сделайте это.

Действительная сила абстракции

Это первая сила абстракций: они делают разговоры и делают все намного проще.

Вторая сила абстракций исходит из приятного свойства композиции: как только вы определили абстракции, вы можете создать две или более абстракции, чтобы сформировать новую большую абстракцию: скажем, вы устали рисовать квадраты, но вы действительно хотите нарисовать дом. Предположим, что мы уже определили треугольник, поэтому мы можем определить:

  • house = > нарисуйте квадрат с треугольником над ним

Затем вы хотите деревню:

  • деревня = > нарисовать несколько домов рядом друг с другом.

О, подождите, мы хотим город - и у нас есть новая концепция улицы:

  • city = > привлечь много деревень близко друг к другу, заполнить пустые пространства большим количеством домов, но оставить место для улиц.
  • street = > (определение улицы)

и т.д.

Как это все относится к программированию?

Если при планировании вашей программы (процесса, известного как анализ и дизайн) вы обнаружите хорошие абстракции к проблеме, которую вы пытаетесь решить, ваши программы становятся короче, поэтому легче писать и, возможно, более важно - проще читать. Способ сделать это - попытаться понять основные концепции, которые определяют ваши проблемы - как в (упрощенном) примере рисования дома, это были квадраты и треугольники, чтобы рисовать деревню, это были дома.

В программировании мы определяем абстракции как функции (и некоторые другие конструкции, такие как классы и модули, но теперь будем фокусироваться на функциях). Функция по существу называет набор отдельных операторов, поэтому функция по существу является абстракцией - подробности см. В примерах в вашей книге.

Красота всего этого

В программировании абстракции могут создавать или нарушать производительность. Поэтому часто часто используемые функции собираются в библиотеки, которые могут быть повторно использованы другими. Это означает, что вам не нужно беспокоиться о деталях, вам нужно только понять, как использовать готовые абстракции. Очевидно, что это должно облегчить вам задачу, поэтому вы можете работать быстрее и, следовательно, быть более продуктивным:

Пример:

Представьте, что есть графическая библиотека под названием "nicepic", которая содержит предопределенные функции для всех абстракций, рассмотренных выше: прямоугольники, квадраты, треугольники, дом, деревня.

Предположим, вы хотите создать программу, основанную на вышеуказанных абстракциях, которая красит красивую картину дома, все, что вам нужно написать, это:

import nicepic
draw_house()

Итак, просто две строки кода, чтобы получить что-то более сложное. Разве это не замечательно?

Надеюсь, что это поможет.

Ответ 2

Отличный способ понять абстракцию - это абстрактные классы.

Скажем, мы пишем программу, которая моделирует дом. В доме будет несколько разных комнат, которые мы будем представлять как объекты. Мы определяем класс для ванной комнаты, кухни, гостиной, столовой и т.д.

Тем не менее, все они являются "Комнатыми" и, таким образом, имеют несколько свойств (количество дверей/окон, квадратных футов и т.д.). НО, комната никогда не может существовать на ней... это всегда будет какой-то тип номер.

Тогда имеет смысл создать абстрактный класс под названием "Комната", который будет содержать свойства, разделяемые всеми комнатами, а затем иметь классы "Кухня", "Гостиная" и т.д., наследовать комнату абстрактного класса.

Концепция комнаты абстрактна и существует только в нашей голове, потому что любая комната, которая на самом деле существует, - это не просто комната; это спальня или гостиная или классная комната.

Мы хотим, чтобы наш код, таким образом, представлял наш "умственный кусок". Он делает все намного опрятным и легче справляется.

Ответ 3

Как определено на wikipedia: Abstraction_ (computer_science)

Абстракция пытается отделить детали от общей картины, чтобы программисты могут работать близко к уровню человеческой мысли, оставляя детали, которые имеют значение на практике, но не являются неотложными для проблемы, являющейся решена.

В основном это устраняет детали проблемы. Например, для рисования квадрата требуется несколько шагов, но мне просто нужна функция, которая рисует квадрат.

Ответ 4

Лучший способ описать что-то - использовать примеры:

Функция - это не что иное, как серия команд, чтобы получить материал. В принципе, вы можете организовать фрагмент кода, который делает одну вещь. Эта единственная вещь может снова использоваться снова и снова через вашу программу.

Теперь, когда ваша функция выполняет эту задачу, вы должны называть ее так, чтобы она мгновенно идентифицировалась относительно того, что она делает. Как только вы его назвали, вы можете повторно использовать его повсюду, просто называя его именем.

def bark():
  print "woof!"

Затем, чтобы использовать эту функцию, вы можете просто сделать что-то вроде:

bark();

Что произойдет, если мы хотим, чтобы это лает 4 раза? Ну, вы могли бы написать кору(); 4 раза.

bark();
bark();
bark();
bark();

Или вы можете изменить свою функцию, чтобы принять какой-либо тип ввода, чтобы изменить, как он работает.

def bark(times):
    i=0
    while i < times:
        i = i + 1
        print "woof"

Тогда мы могли бы просто вызвать его один раз:

bark(4);

Когда мы начинаем говорить об объектно-ориентированном программировании (ООП), абстракция означает что-то другое. Вы узнаете эту часть позже:)

Ответ 5

Скажем, вы пишете функцию, которая получает кучу текста в качестве параметра, затем читает учетные данные в файле конфигурации, затем подключается к SMTP-серверу с использованием этих учетных данных и отправляет почту с использованием этого текста.

Функция должна быть названа sendMail (текст), а не parseTextReadCredentialsInFileConnectToSmtpThenSend (текст), потому что проще представить, что она делает таким образом, для себя и при представлении API для коллег или пользователей... хотя второе имя более точное, первое - это лучшая абстракция.

Ответ 6

Абстракция: - очень важная концепция как в аппаратном, так и в программном обеспечении.

Важность: Мы, человек, не можем все время помнить. Например, если ваш друг быстро произнесет 30 случайных чисел и попросит вас добавить их все, это будет невозможно для вас. Причина? Возможно, вы не сможете учесть все эти цифры. Вы можете записать эти цифры на бумаге, даже тогда вы будете добавлять правые цифры, поочередно игнорируя левые цифры, а затем игнорируя правые самые цифры в другой момент, добавив самые нужные.

Это показывает, что когда-то мы, человек, фокусируем на какой-то конкретной проблеме, игнорируя те, которые уже решены, и фокусируемся на том, что нужно решить.

Игнорирование менее важной вещи и фокусировка самого важного (на данный момент и в конкретном контексте) называется Абстракция

Вот как работает абстракция в программировании.

Ниже представлена ​​всемирно известная программа приветствия на языке C:

//C hello world example hello.c
#include <stdio.h>

int main()
{
  printf("Hello world\n");
  return 0;
}

Это самая простая и обычно первая компьютерная программа, которую программист пишет. Когда вы компилируете и запускаете эту программу в командной строке, вывод может выглядеть следующим образом:

введите описание изображения здесь

Вот серьезные вопросы

  • Компьютер понимает только двоичный код, как он мог запускать ваш английский, как код? Вы можете сказать, что вы скомпилировали код в двоичный код с помощью компилятора. Вы писали компилятор, чтобы ваша программа работала? Нет. Тебе не нужно. Вы установили компилятор GNU C в свою систему Linux и просто использовали его, указав команду:

gcc -o hello hello.c

И он преобразует ваш английский, как код языка C, в двоичный код, и вы можете запустить этот код, указав команду:

./привет

Итак, для написания приложения в программе C вам никогда не нужно знать, как компилятор C преобразует код языка C в двоичный код. Таким образом, вы использовали компилятор GCC как абстракцию.

  1. Вы пишете код для функций main() и printf()? Нет. Оба уже определены кем-то на языке C. Когда мы запускаем программу на C, она ищет функцию main() как отправную точку программы, в то время как функция printf() выводит результат на экран компьютера и уже определена в stdio.h, поэтому мы должны включить ее в программу. Если обе функции еще не были написаны, нам пришлось написать их сами, чтобы напечатать два слова, а компьютеры будут самыми скучными машинами на земле. Здесь вы также используете абстракцию, то есть вам не нужно знать, как printf печатает текст на мониторе, и все, что вам нужно знать, - это указать ввод функции printf, чтобы он отображал желаемый результат.

Я просто не расширил ответ на абстракцию операционной системы, ядра, прошивки и оборудования для простоты.

Что нужно помнить:

При программировании вы можете использовать абстракцию различными способами, чтобы сделать вашу программу простой и простой.

Пример 1: вы можете использовать константу для абстрактного значения PI 3.14159 в своей программе, потому что PI легко запомнить, чем 3.14159 для остальной программы

Пример 2: Вы можете написать функцию, которая возвращает квадрат заданного числа, а затем любой, включая вас, может использовать эту функцию, указав ее как параметры и получая от нее возвращаемое значение.

Пример 3. В объектно-ориентированном программировании (OOP), например Java, вы можете определить объект , который инкапсулирует данные и методы, и вы можете использовать этот объект, вызывая его методы.

Пример 4. Многие приложения предоставляют вам API, который вы используете для взаимодействия с этим приложением. Когда вы используете методы API, вам никогда не нужно знать, как они реализованы. Итак, абстракция есть.

Во всех примерах вы можете осознать важность абстракции и того, как она реализована в программировании. Одна важная вещь, которую следует помнить, заключается в том, что абстракция является контекстуальной, т.е. Продолжает меняться в соответствии с контекстом