|
"Structured programming – don’t use unrestrained GOTO;
functional programming – don’t use assignment;
object-oriented programming – don’t use pointers to functions."
Robert C. Martin
Когда говорят об абстракции в обыденности, подразумевают что-то эфемерное, идеальное, не
существующее в физическом мире. Между тем абстракция является очень важным инструментом в
программировании. На простом примере попробуем понять почему. Вот знакомая всем запись,
.
Здесь есть несколько абстрактных элементов. Переменные
и
сами по себе являются абстракциями возможных конкретных значений. Функция является абстрактным
механизмом преобразования значения переменной в значение переменной . Знак равенства
указывает на то, что в данном контексте
применение функции к аргументу равносильно значению переменной . Это позволяет сокращать записи математических выражений или значительно их упрощать. Например,
;
выражение выше можно упростить с помощью абстракции,
;
тогда изначальное выражение можно переписать,
.
Скрыв подробности функции в переменной можно сосредоточиться на работе с квадратичной функцией, при необходимости раскрывая определение переменной . Использование абстракции в выражениях называется комбинацией [Башкин].
В программировании абстракцию приходится применять похожим образом. Код ниже это иллюстрирует.
push rbp
mov rbp, rsp
mov edi, OFFSET FLAT:.string "Hello, World!"
mov eax, 0
call printf
mov eax, 0
pop rbp
Неопытным взглядом сложно понять что именно происходит, особенно если не знать инструкции, которые используются в этом фрагменте. При этом, существует механизм, создающий абстракцию этих инструкций, который приводит весь фрагмент к другому виду:
printf(“Hello, World!”);
Новая запись предельно краткая, но полностью скрывает происходящее в момент применения функции
printf к аргументу. Тем не менее, такая форма является более предпочтительной,
потому что в подавляющем большинстве случаев программиста не столько интересует конкретный набор
инструкций, сколько окончательный результат. Под таким углом полезность абстракций очевидна.
Эту концепцию поначалу трудно представить, когда речь идет о типах данных. И тем не менее, программирование в значительной степени состоит из взаимодействий с различными уровнями абстракций типов.
Оглавление
- Абстрактные типы данных
- Сокрытие данных и инкапсуляция
- Конструкторы
- Перегрузка функций
- Перегрузка операторов
- Полиморфизм, первая часть
- Наследование
- Полиморфизм, вторая часть
- Шаблоны типов
- Полиморфизм, третья часть
Библиография
- Башкин, В. А., “Лямбда-выражения”, Лямбда-исчисление, 2018, с. 8.
- Вики-конспекты(а), “Двоичная куча”, ИТМО, 4 сентября, 2022,
[neerc.ifmo.ru].
- Вики-конспекты(б), “Красно-черное дерево”, ИТМО, 4 сентября, 2022,
[neerc.ifmo.ru].
- Вики-конспекты(в), “Хеш-таблица”, ИТМО, 4 сентября, 2022,
[neerc.ifmo.ru].
- Вики-конспекты(г), “Лямбда-исчисление”, ИТМО, 4 сентября, 2022,
[neerc.ifmo.ru].
- Овчинников, А. В., “Множество, замкнутое относительно операции”, Теория групп. Лекционный
курс, Москва, 2016, с. 10.
- Степанов, А. А., “Наибольшая общая мера: последние 2500 лет”, 2010.
- ANSI, “ISO-IR-6: ASCII Graphic Character Set”, ANSI, December 1, 1975.
- Brinkerhoff, D. A., “Introduction to files and I/O streams”, Streams, Object-Oriented
Programming Using C++, Weber State University, 2015-2022,
[icarus.cs.weber.edu].
- Cardelli, L., Wegner, P., “On Understanding Types, Data Abstraction, and Polymorphism”,
Computing Surveys, Vol 17 n. 4, 1985, pp. 471-522.
- Chu, I., “Dynamic Dispatch in Object Oriented Languages”, Concepts of Programming Languages, Course notes,
[condor.depaul.edu].
- Clarkson, M. R. et al., “Type Inference”, OCaml Programming: Correct + Efficient +
Beautiful,
[cs3110.github.io].
- Cormen, T. H., et al., “Common divisors and greatest common divisors”, Number-Theoretic
Algorithms, Introduction to Algorithms, 4th ed., 2022, p. 906.
- CPP(a) Reference, “Value categories”, May 20, 2023,
[en.cppreference.com].
- CPP(b) Reference, “Operator overloading”, May 18, 2023,
[en.cppreference.com].
- CPP(c) Reference, “Virtual” function specifier, June 1, 2022,
[en.cppreference.com].
- CPP(d) Reference, “Placeholder type specifiers”, May 5, 2023,
[en.cppreference.com].
- CPP(e) Reference, “Iterator library”, June 17, 2023,
[en.cppreference.com].
- CPP(f) Reference, “std::variant”, April 17, 2023,
[en.cppreference.com].
- CPP(g) Reference, “Smart pointers”, July 6, 2020,
[en.cppreference.com].
- CPP(h) Reference, “std::shared_ptr”, Dynamic memory management, March 2, 2023,
[en.cppreference.com].
- Gill, P. E., et al., “Reference Counting”, Iotr documentation, August 27, 2003,
[ccom.ucsd.edu].
- Goldberg, A., Kay, A., “The Smalltalk World and Its Primitives”, Smalltalk-72 instruction
manual, Palo Alto Research Center, Xerox, March, 1976, p.48.
- Hinnant, H. E., et al., “A Brief Introduction to Rvalue References”, June 12, 2006,
[open-std.org].
- IBM, “Restrictions on default arguments (C++ only)”, March 23, 2021,
[ibm.com].
- Knuth, D. E., “The Greatest Common Divisor”, Rational Arithmetic, Arithmetic, The Art of
Computer Programming, vol. 2, 3rd ed., 1998, p. 338.
- McJones, P., Stepanov, A., “Foundations. Values”, Elements of Programming, Semigroup Press,
2019, p. 2.
- Moore, P., “Rational.hpp”, Boost Libraries Documentation,
[boost.org].
- Polacek, M., “Understanding when not to std::move in C++”,
[developers.redhat.com].
- Pomeranz, A., “Inheritance and access specifiers”, Inheritance, LearnC++, March 24, 2022,
[learncpp.com].
- Radford, M., ”C++ Interface Classes - An Introduction”, Overload 12(62), ACCU, August, 2004,
[accu.org].
- Ritchie, D.M., “The Development of the C Language”, History of Programming Languages, 2nd
ed., ACM Press, 1996.
- Standard C++ Foundation, “Inheritance – Multiple and Virtual Inheritance”, Standard C++
Foundation Wiki,
[isocpp.org].
- Strachey, C., “Fundamental Concepts in Programming Languages”, Higher-Order and Symbolic
Computation, 13, 2000, p. 13.
- Stroustrup, B., Sutter, H., “C++ Core Guidelines”, International Standardization
Organization C++, 2022,
[isocpp.github.io].
- WG14 / N1256, “Types”, Concepts, Language, ISO/IEC 9899:TC3, Committee Draft, 2007, p. 33.
- Whitney(a), T., et al., “delete operator”, Built-in operators, precedence and associativity,
C++ Language Reference, Microsoft Docs, August 3, 2021,
[docs.microsoft.com].
- Whitney(b), T., et al., “__interface”, Classes and Inheritance, C++ Language Reference,
Microsoft Docs, August 3, 2021,
[docs.microsoft.com].
- Wirth, N., “Representation of Arrays, Records, and Sets”, Fundamental Data Structures,
Algorithms and Data Structures, 1985, p. 21.
Copyright © 2023 Брынзан, Л. В.
GNU General Public License
“Commons Clause” License Condition v1.0
GPL Attribution-ShareAlike 4.0 International
|