"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

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

y = f ( x ) .

Здесь есть несколько абстрактных элементов. Переменные x и y сами по себе являются абстракциями возможных конкретных значений. Функция f является абстрактным механизмом преобразования значения переменной x в значение переменной y. Знак равенства указывает на то, что в данном контексте применение функции f к аргументу равносильно значению переменной y. Это позволяет сокращать записи математических выражений или значительно их упрощать. Например,

4x4-x2-x+2 ;

выражение выше можно упростить с помощью абстракции,

y=2x2+x+1; ;

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

y2-y+2 .

Скрыв подробности функции в переменной y можно сосредоточиться на работе с квадратичной функцией, при необходимости раскрывая определение переменной y. Использование абстракции в выражениях называется комбинацией [Башкин].

В программировании абстракцию приходится применять похожим образом. Код ниже это иллюстрирует.


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 к аргументу. Тем не менее, такая форма является более предпочтительной, потому что в подавляющем большинстве случаев программиста не столько интересует конкретный набор инструкций, сколько окончательный результат. Под таким углом полезность абстракций очевидна.

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

 

Оглавление

  1. Абстрактные типы данных
  2. Сокрытие данных и инкапсуляция
  3. Конструкторы
  4. Перегрузка функций
  5. Перегрузка операторов
  6. Полиморфизм, первая часть
  7. Наследование
  8. Полиморфизм, вторая часть
  9. Шаблоны типов
  10. Полиморфизм, третья часть

Библиография

  1. Башкин, В. А., “Лямбда-выражения”, Лямбда-исчисление, 2018, с. 8.
  2. Вики-конспекты(а), “Двоичная куча”, ИТМО, 4 сентября, 2022, [neerc.ifmo.ru].
  3. Вики-конспекты(б), “Красно-черное дерево”, ИТМО, 4 сентября, 2022, [neerc.ifmo.ru].
  4. Вики-конспекты(в), “Хеш-таблица”, ИТМО, 4 сентября, 2022, [neerc.ifmo.ru].
  5. Вики-конспекты(г), “Лямбда-исчисление”, ИТМО, 4 сентября, 2022, [neerc.ifmo.ru].
  6. Овчинников, А. В., “Множество, замкнутое относительно операции”, Теория групп. Лекционный курс, Москва, 2016, с. 10.
  7. Степанов, А. А., “Наибольшая общая мера: последние 2500 лет”, 2010.
  8. ANSI, “ISO-IR-6: ASCII Graphic Character Set”, ANSI, December 1, 1975.
  9. 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].
  10. Cardelli, L., Wegner, P., “On Understanding Types, Data Abstraction, and Polymorphism”, Computing Surveys, Vol 17 n. 4, 1985, pp. 471-522.
  11. Chu, I., “Dynamic Dispatch in Object Oriented Languages”, Concepts of Programming Languages, Course notes, [condor.depaul.edu].
  12. Clarkson, M. R. et al., “Type Inference”, OCaml Programming: Correct + Efficient + Beautiful, [cs3110.github.io].
  13. Cormen, T. H., et al., “Common divisors and greatest common divisors”, Number-Theoretic Algorithms, Introduction to Algorithms, 4th ed., 2022, p. 906.
  14. CPP(a) Reference, “Value categories”, May 20, 2023, [en.cppreference.com].
  15. CPP(b) Reference, “Operator overloading”, May 18, 2023, [en.cppreference.com].
  16. CPP(c) Reference, “Virtual” function specifier, June 1, 2022, [en.cppreference.com].
  17. CPP(d) Reference, “Placeholder type specifiers”, May 5, 2023, [en.cppreference.com].
  18. CPP(e) Reference, “Iterator library”, June 17, 2023, [en.cppreference.com].
  19. CPP(f) Reference, “std::variant”, April 17, 2023, [en.cppreference.com].
  20. CPP(g) Reference, “Smart pointers”, July 6, 2020, [en.cppreference.com].
  21. CPP(h) Reference, “std::shared_ptr”, Dynamic memory management, March 2, 2023, [en.cppreference.com].
  22. Gill, P. E., et al., “Reference Counting”, Iotr documentation, August 27, 2003, [ccom.ucsd.edu].
  23. Goldberg, A., Kay, A., “The Smalltalk World and Its Primitives”, Smalltalk-72 instruction manual, Palo Alto Research Center, Xerox, March, 1976, p.48.
  24. Hinnant, H. E., et al., “A Brief Introduction to Rvalue References”, June 12, 2006, [open-std.org].
  25. IBM, “Restrictions on default arguments (C++ only)”, March 23, 2021, [ibm.com].
  26. Knuth, D. E., “The Greatest Common Divisor”, Rational Arithmetic, Arithmetic, The Art of Computer Programming, vol. 2, 3rd ed., 1998, p. 338.
  27. McJones, P., Stepanov, A., “Foundations. Values”, Elements of Programming, Semigroup Press, 2019, p. 2.
  28. Moore, P., “Rational.hpp”, Boost Libraries Documentation, [boost.org].
  29. Polacek, M., “Understanding when not to std::move in C++”, [developers.redhat.com].
  30. Pomeranz, A., “Inheritance and access specifiers”, Inheritance, LearnC++, March 24, 2022, [learncpp.com].
  31. Radford, M., ”C++ Interface Classes - An Introduction”, Overload 12(62), ACCU, August, 2004, [accu.org].
  32. Ritchie, D.M., “The Development of the C Language”, History of Programming Languages, 2nd ed., ACM Press, 1996.
  33. Standard C++ Foundation, “Inheritance – Multiple and Virtual Inheritance”, Standard C++ Foundation Wiki, [isocpp.org].
  34. Strachey, C., “Fundamental Concepts in Programming Languages”, Higher-Order and Symbolic Computation, 13, 2000, p. 13.
  35. Stroustrup, B., Sutter, H., “C++ Core Guidelines”, International Standardization Organization C++, 2022, [isocpp.github.io].
  36. WG14 / N1256, “Types”, Concepts, Language, ISO/IEC 9899:TC3, Committee Draft, 2007, p. 33.
  37. Whitney(a), T., et al., “delete operator”, Built-in operators, precedence and associativity, C++ Language Reference, Microsoft Docs, August 3, 2021, [docs.microsoft.com].
  38. Whitney(b), T., et al., “__interface”, Classes and Inheritance, C++ Language Reference, Microsoft Docs, August 3, 2021, [docs.microsoft.com].
  39. 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