Що нового з'явилося у бейсіці за останні роки.
Я декілька разів намагався якось підсумувати нові просунуті можливості Бейсіка (VB.NET), наприклад - Практическое применение наследования, полиморфизма, интерфейсов, дженериков и делегатов на примерах в Visual Basic .NET, Работа с классами и коллекциями, SiteChecker - утилита оптимизации сайта але ніяк не виходить сформулювати всі ці питання якось системно і глобально. До того ж, все написано з 2005 до 2008 року, тобто біля 10-13 років тому. А з тих часів багато чого нового з'явилося у можливостях бейсіка. Отже, давайте спочатку перерахуємо то, що на мою думку, є "звичайними" можливостями бейсіка, тобто можливостями, існуючими у ньому вже більше 10-ти років.
По-перше, бейсік має дуже багато особливостей, взагалі це найбільш могутня мова .NET Framework, набагато могутніша ніж C#, ось будь ласка подивиться переваги на цій сторінці, який вже більше п'яти років - Difference between VB and C#.. Не знаю, навіть як перерахувати все, але почнемо потрохи.
- Делегати-евенти і усе пов'язане з цім питанням (Delegate/AddresOF/Invoke, Event/RaiseEvent/AddHandler/WithEvents/Handles). Глобально, документація на ці питання виглядає Events. Delegates, Declaring and Raising Events, Custom Events, Inherited Event, Events in Windows Forms.pdf, Declaration statements. Delegate, Interface, Event and other.pdf. Більш понятною мовою (для тих, хто програмує біля 30-40 років, і пам'ятає ще Фортран і Ассемблер) це називається CallBack. У більш сучасної термінології це називається Delegate. За допомогою цих ключових слів ви маєте можливість (1) утворити по AddressOF адресу Калбеку у викликаючої процедурі і передати цю адресу як параметр до викликаної процедури, де звернутися до цього Калбеку по Invoke. Однаковий тип калбеку забезпечується об'явою Delegate, тобто, грубо кажучи, все що викликається по Invoke спочатку повинно мати об'яву Delegate, а потім у Run-time повинно отримати адресу по AddressOF. (2) Можна в якомусь класі зробити об'яву Event, а потім викликати цей Event по RaiseEvent. У зовнішньому коді обробку цього калбеку можливо зробити або статично (якщо класс задекларований з WithEvents) по Handles, або динамічно, додаючи обробник калбеку по AddHandler/RemoveHandler. (3) Фактично Delegate - це статичні об'яви Event'ів, тобто калбеків. Фактично source-код "Public Event GetHTML(ByVal URL As String, ByRef HTML As String)" компілюється в код "Public Delegate Sub GetHTMLEventHandler(URL As String, ByRef HTML As String)" плюс "Public Custom Event GetHTML As GetHTMLEventHandler". З другого боку. можна зробити один якийсь більш-меньш универсальний делегат UniversalDelegate(sender as Object, e as EventArgs), а потім використовувати цей Event у всьому .NET-фреймворці (приблизно так і зроблено на практиці). Це найбільш класичні можливості бейсіку, наприклад ось я знайшов у себе якийсь чудо-код ще на VB6 Редактируемое дерево с меняющимся контекстным меню - який працює на Делегатах і Евентах.
- Можливості об'єктного програмування. Усі нові можливості порівняно з VB6 з'явилися у 2002-му році (Язык программирования VB.NET) і тоді я розбирався як пов'язані між собою ключові слова Interfaces-Class-Module-Namespace-MyBase-MyClass-New , модифікатори видимості Shadows-Private-Protected-Public-Shared-Static і об'яви наслідування Inherits-MustInherit-MustOverride-NotInheritable-NotOverridable-Overloads-Overridable-Overrides. Ось моя табличка з тих років. А ось більш сучасна офіційна інформація на цю тему Objects and Classes. Overloading, Inheritance, Anonymous Type, Initializers, Lifetime.pdf, Interfaces. Implementing Interfaces, Generic Interfaces.pdf У цьому напрямку, як у попередньому напрямку Event-Delegate, мабуть, з тих часів нічого не змінилося. Тобто вже пройшло більше 15-ти років, тому я називаю це класичними можливостями бейсіку. Я багато разів намагався публікувати якийсь приклади, як це використовується, ну ось наприклад щось від 2005-го року - Типизируемый тип столбца в GridView.
- Питання передачи параметрів ByRef/ByVal, Optional, ParamArray, Structure, Property, Enum Procedures. Argiment and Parameters, Return Value, ByRef and ByVal, ParamArray, Optional, ByName and ByPos.pdf, Enumerations. Iteration on Enum, Value of Enum.pdf
- Існує багато достатньо класичних питань що стосуються специфіки окремих типов даних, які і формують сучасний бейсік, наприклад Nullable type, Lifetime of Objects, Data Type Conversion. Дещо з цих головних питань, що формуть сучасний бейсік ви можете подивитися ось тут - Early and Late Binding.TypeName, TypeOf, CallByName, CreateObject, IDisposable, Garbage Collection, DynamicObject, ExpandoObject.pdf
Data Types. Simple and Complex, Conversion, Nullable, Float, Generic.pdf
Enumerations. Iteration on Enum, Value of Enum.pdf
VB ObjectConversion. CType, TryCast, IS, Nothing, Of, In, TypeOf.pdf
- Дженеріки (Of) і Контрейнси (Of ... As ....) (Concepts. Covariance and Contravariance in Interface and Delegates.pdf - це алгоритми, які можливо написати без прив'язки до конкретних класів або обробляємих даних. Це важливе питання, бо у сучасному бейсіці це має подальший розвиток, на якому я далі зупинюсь детальніше, бо зовні код виглядає як META-Generic, тобто це називається Extension-функції, які я вже декілька разів намагався описувать на своєму сайті, наприклад ось тут - Unit-тести для ASP.NET MVC. Наприклад я написав свої власні поширення Linq-to=SQL, якими я постійно користуюся.
- З незапам'ятних часів у Бейсіці існує питання роботи з найбільш поширеними типами даних: String Strings. Culture, Convert, Validate, Crypt.pdf, VB String. Function and Formating.pdf, А ось тут я ще в 2003-му році робив якийсь підсумок щодо специфічних технологій обробки стрічок - Специализированные технологии обработки строк в NET.
LINQ - Features That Support LINQ.pdf, LINQ. Update, Combine, Custom func, LINQ Providers for Anonymous, Extension, Lambda, Generic, String, XML, Dataset, Arraylist, Assembly, FileSystem.pdf, Concepts. LINQ in ADO.NET, Entities, Strings, FileSystem, Reflections, Arraylist.pdf.
XML XML. Creating, Manipulation, Accesing, LINQ.pdf, VB XML. Literal, Expression, Axis.pdf
VB Math and DateTime function.pdf.
Array Arrays. Init, Sort, Jagged.pdf, Collection Collections.Init, Extension init.pdf - Існує ще достатньо багато октемих питань, наприклад Attribute (VB Keywords, Attribytes, Constants, Directives, Modifiers.pdf). Це невеличкі теги, які додаютья до класів. Але у з'вязку з тим у стеці .NET-технологій (Variants of ASP NET Technology stack), з'явилися нові заходи доступу до даних (Класифікація засобів роботи з даними.), та старі технології типу MVVM (Про модний термін MVVM.) отримали нове дихання - то ці невеличкі питання несподіванно виявились важливими.
Є класичні методики мульти-поточного програмування, які багато разів описані у мене на сайті, Мультипоточное программирование. - але це питання має дуже цікаве сучасне подовження, наприклад з'явилося багато нових нових бібліотек, наприклад Parallelize LINQ Queries using PLINQі зовсім нових засобів мультіпоточного програмування.
Дуже багато методік програмування не змінилися з 2002-го року, це поперше Network programing (Network programing. Part 1.pdf, Network programing. Part 2.pdf - якщо не брати до ваги нові засоби мультіпоточності!
Зовсім не змінилися Remote prorgaming та NET-COM взаємодія Reflection. Dynamic Code Generation.pdf, тобто будь-які мої підходи до програмування, описані ще в 2003-му році Remoting-программирование., Связь NET-COM. - працюють і досі добре
Не змінилося програмування графіки - GDI+ Part 1.pdf, GDI+ Part 2.pdf, GDI+ Part 3.pdf
Не змінилося Security Security in the NET Framework.pdf та криптографія Cryptography.pdf - тобто будь-що, описане мною ще 10 років тому, наприклад NetStringObfuscatorHelper - OpenSource моей библиотеки симметричного шифрования. або Remote SQL execute for PostgreSQL on GSM/GPRS channel with extreme compress and cryptography. (я вже не кажу про більш нові мої нотатки на цю тему).
Все перераховано вище - це достатньо класичні можливості бейсіку, більшість з яких існує з 2002-го року, а деякі ще з VB6.
А що самє я визначаю як CRASY BASIC, тобто дуже незвичайний бейсік?
- З'явилися і набули поширення зовсім нові засоби Control Flow програм - Yield - і ці люди забороняли нам багато років колупатися у носі?, тобто ще більш незвичайі та непрогнозовані засоби виконання якихось окремих фрагментів коду, ніж GoTo, Евенти та наслідування класів. Все те ж саме дуже просто зробити звичайними Калбеками, тобто Евентами, делегатами тощо.
- З'явилася нова бібліотека доступа до даних Entity Framework Класифікація засобів роботи з даними. яку я вже використував декілька разів, наприклад ось тут Тест для компанії bobs.bg (C#, MVC 5, AJAX, EntityFramework). Ця бібліотека не виглядає як дуже розумна, тобто вона вимагає наприклад використання Repository Patern, який в мене описаний ось тут наприклад Застосування патерну Dependency Injection за допомогою IoC-контейнера Ninject. Аналогічні операції на рівні SQL або у інших ORM робилися набагато краще, але ніхто і не обіцяв легких шляхів з цією бібліотекою, бо це дуже спеціфічна бібліотека, яка була розроблена для легкої заміни SQL-серверу на протязі життя софта і яка, наприклад, взагалі нічого не знає про в'юхи у SQL, та про різницю між MS SQL та MySQL. Зато має якийсь незрозумілі для мене можливості, тобто наприклад вся реляційні дані, яки до цього зберігалися у різні нормалізовані табли SQL-серверу ці бібліотека може сховати у один стовпець однієї таблички - хм... кому і навіщо це може бути потрібно?
- Всі (у тому числі інколи і я - Мої поширення Linq-to-SQL.) стали набагато більше писати Extension-функцій, тобто функцій, які поширюють базові класи (у більшості випадків це класи на дженеріках, які виконують якийсь загальні алгоритми, незалежні від конкретних класів), тобто для себе я їх називаю МЕТА-дженеріками Procedures. Lambda, Extensions, Property.pdf. Здається, це корисна можливість. Наприклад ви використовуєте дуже подібну функцію на дженеріках, у який відрізняється невеличкі фрагменти. І маєте бажанні уніфікувати код, звести його в одне місце. Хоча... питання уніфікації кода, зведення його в універсальні функції = це спірне питання. Це може дуже зашкодити легкості змін у софті по вимогам замовників. Прості фрагментарні функції змінювати набагато легче, ніж великі універсальні функції.
- Досить екзотичні можливості Lambda Expression більше і більше поширюються. Анонімні Lambda-Expression, Анонімні Lambda-Expression у Делегатах. Procedures. Lambda, Extensions, Property.pdf,Delegates. Invoke, Parameters, Lambda, Async Lambda.pdf, Objects and Classes. Overloading, Inheritance, Anonymous Type, Initializers, Lifetime.pdf. Мабуть це теж корисна можливість, якщо фреймворк написаний на Дженеріках, без прив'язок до конкретних класів. Але потрібно розуміти, що Lambda Expression - це не більше, як скорочення сінтаксісу - яке може покращити порозуміння програми, а може і погіршити. Наприклад, якщо ви запишете десь "Sub(e) e.CrDate = Now" це фактично компілюється у звичайну функцію з прихованим _Lambda$__XXXX.
- Далі поширилися можливості бейсіка CallByName, тобто динамічного формування якихось байтів і виконання їх як коду Early and Late Binding.TypeName, TypeOf, CallByName, CreateObject, IDisposable, Garbage Collection, DynamicObject, ExpandoObject.pdf. Не думаю, що це якесь всім потрібне поширення. Я пишу проги кожний день, але так і нем необхідності використовувати ці можливості.
- З'явився новий погляд на обьектну організацію програм - Теоретичні питання програмування., тобто зараз набагато більше уваги звертається на стандартну взаємодію класів, наслідовання одного від іншого, взаємодію евентів між ними. У цій тематиці є дещо корисне, але мені здається, що більша частина цього масива інформації - це чисто теоретичні спекуляції. Щоб це від теоретичних спекуляцій перешло до категорії практики - потрібно писати якийсь величезні фреймворки у величезній команді програмистів - тоді так, це корісний погляд на будування величезних фрейворків з дуже складною взаємодією між командами розробників та класами. Але у програмах до 100 тисяч це більше нагадує теоретичні спекуляції.
AOP in .NET - Practical Aspect-Oriented Programming.pdf
Architecting Applications.epub
Architectural Patterns and Styles.pdf
Article about Design pattern.pdf
Beginning SOLID Principles and Design Patterns for ASP.NET Developers.pdf
Domain Driven Design Pattern.pdf
Factory and Observer Design Pattern.pdf
Managing Agile Software Projects.pdf
- Дуже багато нового з'явилося у технологіях мультіпоточному програмування. Це дуже велика тема і, нажаль, зараз я не маю зараз у цьому напрямку достатньо досвіду, бо мені досить нечасто перепадає робота з мільтіпоточними прогами.
Asynchronous Programming Patterns.pdf
Task-based Asynchronous Pattern.pdf
Event-based Asynchronous Pattern.pdf
Asynchronous Programming Model.pdf
Threading. Programing Concept.pdf
Threading Objects and Features.pdf
Asynchronous Programming with Async and Await.pdf
Fine-Tuning Async Application.pdf
Нище перераховані мої деякі нотатки, у яких я використовував нові можливості VB2015. Сорри, ці нотатки я написав безпосередньо на англійській мові.
- Amazing extension function CopyLinqDataMembersByName to expand Linq-to-SQL.
- The simplest way to create site's versioning.
- COM-component for classic ASP.
- Variants of ASP NET Technology stack.
- My web scrapper with asynchronous web request and visual proxy availability detection.
- How to reorder DataRow with Extension function, anonymous types, Lambda Expression and Linq Special Row Comparer.
- Five amazing Linq-to-SQL extension.