Въведение

Разбирането на конвенциите за структуриране на приложение Dart помага да се дефинират и разделят проблемите на обектите и по този начин подготвя пътя за оптимална архитектура на приложението.

За да се постигне това, основното разбиране на пакетите, библиотеките и механизма за импортиране е от решаващо значение.

Dart е проектиран с мисъл за поддържане на модулността и в Dart това се постига чрез пакети, библиотеки и класове.

В тази статия ще разделим разликата между библиотеки и пакети, както и ще обясним как да ги импортирате.

Библиотека:

В програмирането библиотеката е колекция от предварително компилирани процедури, които програмата може да използва. Рутините, понякога наричани модули.
— webopedia.com

⇒ всяко приложение на Dart е библиотека, дори когато не използва директорията lib.

Библиотеките в Dart не са изключение, когато структурирате кода си, може да попаднете на набор от програмни инструкции (функции, константи, класове ...), които споделят същия интерес.

Библиотеката е възможност за мислене, когато структурирате код, съответно предоставяйки API.

Q: Библиотеки, трябва ли да ги използвам?
A: Да! всъщност библиотеките са важна концепция в обектно-ориентираното програмиране, защото помагат да се сведе до минимум тясното свързване и да се създаде поддържаем код.

Пример: dart:math library е модул, който съдържа математически константи и функции, плюс генератор на произволни числа.

Създаване на собствени библиотеки

  1. Декларирайте библиотеката

За да декларирате библиотека в Dart, използвайте ключовата дума library, последвана от името на библиотеката и точка и запетая.

Пример:

library trigonometric_functions;

2. Импортирайте файлове, които библиотеката ще използва

Нашата библиотека може да се основава на кодова логика, съществуваща в други библиотеки. Импортирането на библиотеки в нашата библиотека е възможно в Dart с помощта на ключовата дума import.

Пример: изградете примера по-горе, който получаваме

library trigonometric_functions;
import dart:math;

3. Част и част от директивите

Когато създавате библиотека, може да искате да разделите логиката на кода на няколко файла. Това е възможно с помощта на директивите part и part of

Пример:

library trigonometric_functions;
import dart:math;
part 'cos.dart';
part 'sin.dart';

cos.dart и sin.dart са файлове, съдържащи кодова логика съответно за функциите косинус и синус. По този начин можем да разделим кодовата логика на библиотеката trigonometric_functions на множество файлове.

Следващата стъпка е да посочите от коя библиотека са част изходните файлове cos.dart и sin.dart! ;)

във файла cos.dart:

part of 'trigonometric_functions';
//cos.dart source code

във файла sin.dart:

part of 'trigonometric_functions';
//sin.dart source code

Забележка: в този пример и двата файла cos.dart и sin.dart се намират в същата папка като файла на библиотеката trigonometric_functions. Обикновено предоставяте относителния път до изходните файлове, на които разчитате.

Забележка: декларацията на библиотеката, импортираните файлове и изходните файлове, които са част от библиотеката, трябва да се намират в горната част, а логиката на библиотеката идва само след това.

Забележка: указанията на Dart препоръчват избягване на директивите part и part of и вместо това разделяне на кода на по-малки библиотеки. В примера по-горе ще създадем библиотеки за sin.dart и cos.dart и ще ги импортираме вътре в trigonometric_functions. Въпреки това директивите part и part of имат предимството да пропускат това импортиране и да го ограничават само до trigonometric_functions.

Вградени и персонализирани библиотеки

В Dart има 2 вида библиотеки:

1. вградени библиотеки
2. персонализирани библиотеки

вградени библиотеки

вградените библиотеки са библиотеки, включени в пакета dart

Пример:

dart:core

Основната библиотека дефинира

вградени типове, колекции и друга основна функционалност за всяка програма на Dart. Тази библиотека се импортира автоматично.

персонализирани библиотеки

персонализираните библиотеки се предлагат с два варианта

  1. външни библиотеки: библиотеки, които са импортирани от външни пакети.
  2. локални библиотеки: библиотеки, които са дефинирани в пакета на входната точка

Пакет

Пакет в Dart е всяка директория, съдържаща pubspec.yaml файл

pubspec.yaml

Pubspec е файл с име pubspec.yaml , който трябва да се намира в директорията на пакета на най-високо ниво.

Pubspec.yaml съдържа метаданни за нашия пакет като name, version number, description и други зависимости на пакети, които нашето приложение използва.

Най-простият pubspec.yaml file е файл, който изброява името на пакета

⇒ Всяко приложение в dart е пакет, защото трябва да има pubspec.yaml файл

В Dart има два вида пакети.

  1. пакет с приложения
  2. библиотечен пакет

⇒ Във файла pubspec.yaml няма специално обозначение, което да показва дали даден пакет е приложение или библиотечен пакет.

кръчма

pub е мениджър на пакети. Това е пакетният мениджър на Dart.

кръчма получите

След като имате pubspec файл, можете да получите зависимостите, дефинирани в този pubspec, като изпълните командата pub get в директорията на пакета, където е дефинирана pubspec.

библиотечен пакет

Пакет, от който могат да зависят други пакети. Пакетите от библиотеки могат да имат зависимости от други пакети и могат сами да бъдат зависимости.

какво прави библиотечен пакет

⇒ освен файла pubspec.yaml, папката lib е задължителна в пакета на библиотеката и трябва да се намира в горното ниво на директорията на пакета.

След това кодът на библиотеката трябва да се намира в директорията lib, така че да е публичен за други пакети.

Можете да създадете произволна йерархия под папката lib. По конвенция кодът за изпълнение се поставя под папката lib/src.
Имайте предвид, че тъй като това е вложена папка, файловете в нея се считат за частни за другите пакети.

Така че имате нещо подобно:

структуриране на библиотечен пакет

пакет за приложение

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

Въпреки че пакетите с приложения не са предназначени да бъдат използвани като библиотеки в други пакети по конвенция, те все още имат папкатаlib и папката_47, където съществува кодът за изпълнение.

Входна точка за дартс

Входна точка на Dart е .dart файл, който съдържа main() функция

Пакет входна точка

Наричан също основен пакет, обикновено е пакет на приложение, е пакетът с входната точка на Dart, който ще се изпълнява. В зависимост от пакетите може също да има входни точки на Dart, но в този контекст пакетът с входна точка е този с входна точка на Dart, предназначен за изпълнение

Директория на входната точка

Директория с входна точка е директория, на която е разрешено да съдържа входни точки на Dart

Pub има бял списък с директории, които могат да бъдат директории с входни точки.

benchmark, bin, example, test, tool и web

Всяка входна точка на Dart в тези директории ще бъде автоматично забелязана от pub. Входната точка на Dart може също да бъде във вложена папка в тези директории. Папката bin обаче е изключение, тъй като входната точка на Dart трябва да съществува в самата папка bin и да не е вложена.

⇒ ето защо най-често ще намерите файла main.dart в някоя от директориите, споменати по-горе.

Бележки:

  1. за разлика от библиотечните пакети, пакетът с приложения се нуждае от main файл, за да бъде изпълнен, така че добавихме main.dart файл в bin директория. Алтернативно, файлът main.dart може да бъде сред другите в папка example или в папка lib .
  2. Пропуснахме публичните файлове в директорията lib, тъй като този пакет е пакет с приложения.

Как работи импортирането

Зависимост

Зависимостта е друг пакет, от който вашият пакет се нуждае, за да работи

Има 2 вида зависимости:

  1. незабавна зависимост:
    „„Зависимост“, която вашият пакет използва директно. Зависимостите, които изброявате във вашата pubspec, са непосредствените зависимости на вашия пакет.“
  2. преходна зависимост:
    „Зависимост, която вашият пакет косвено използва, защото една от неговите зависимости го изисква. Ако вашият пакет зависи от A, който на свой ред зависи от B, който зависи от C, тогава A е „незабавна зависимост“, а B и C са преходни.“

Как да импортирате библиотеки в Dart

3-те вида импортиране в Dart

1: импортиране на библиотека от пакета на dart core

За да импортирате библиотеки, намерени в пакета на dart core, използвайте префикса dart: в името на пътя, последван от името на библиотеката.

Пример:

import 'dart:core';

2: импортиране на библиотека чрез относителния път

За да импортирате библиотеки, използвайки техния относителен път, използвайте ключовата дума import, последвана от името на пътя между кавички.

import '../foo/a.dart';

Пример от документацията на Dart

От лявата страна на дървото виждаме, че и b.dart, и a.dart са в папката lib, а файлътb.dart импортира файла a.dart, използвайки неговия относителен път.

3: импортиране на библиотека с помощта на пакет: префикс, последван от относителния път

За да импортирате библиотеки, намерени в пакети, използвайте префикса package:, последван от името на пътя между кавички.

Пример:

import 'package:my_package/foo/a.dart';

Пример на използване: Този стил на импортиране се използва за импортиране на библиотеки от външни пакети, но може също да използва този стил за импортиране на библиотеки от вашия собствен пакет.

В примерната диаграма по-горе импортирахме файла a.dart във файла main.dart, използвайки префикса package:

Забележка: че можехме да използваме импортиране на относителен път, без да използваме и префикса package: и операторът за импортиране би бил еквивалентен на

import '../lib/foo/a.dart';

В този случай обаче е по-елегантно да използвате префикса package:, последван от името на пакета, тъй като импортираният файл a.dart е в директорията lib, а импортираният файл main.dart не е.

package:package_name е еквивалентен на абсолютния път/lib

Забележка: очевидно можем да използваме префикса package:, когато и файлът за импортиране, и файлът за импортиране са в директорията lib. В примера по-горе, когато b.dart импортира a.dart импортирането ще бъде еквивалентно на

import 'package:my_package/foo/a.dart';

Следващия

Във втората част ще разгледаме

1. пространства от имена: показване, скриване и като ключови думи
2. експорти
3. условни импорти
4. структуриране на конвенционални библиотеки
5. структуриране на конвенционални пакети

Препратки