2014-01-19 9 views
34

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

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

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

Спасибо!

+0

Использование/значение абстракции слова в вашем примере одинаково в мире программирования или вне его. – Lix

+0

Простой: если вы видите вызов функции в вашем коде, скажите 'calculateFooBar (x, y)', вы знаете (или, по крайней мере, имеете какую-то идею), что делает этот (возможно, сложный) код, не заботясь о чтении и понимании весь код, реализующий эту функцию. –

ответ

108

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

Что абстракцию

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

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

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

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

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

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

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

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

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

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

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

Реальная сила абстракции

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

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

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

Далее вы хотите деревню:

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

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

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

и так далее ...

Как все это применить к programmming?

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

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

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

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

Пример:

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

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

import nicepic 
draw_house() 

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

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

+0

Вы делаете мои концепции. – Dexture

+0

Это очень хорошее объяснение, чтобы понять концепцию абстракции, но я до сих пор не понимаю, как это связано с классом, функцией и т. Д., И т. Д. Можете ли вы подробнее рассказать немного больше? – notilas

1

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

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

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

0

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

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

5

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

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

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

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

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

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

1

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

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

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

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); 

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

-1

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

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

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

Игнорирование менее важная вещь, и сосредоточив внимание наиболее важным (в настоящее время и в определенном контексте) называется Абстракция

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

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

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

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

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

enter image description here

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

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

gcc -o привет привет.с

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

./hello

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

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

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

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

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

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

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

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

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

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

Смежные вопросы