Въведение
Разбирането на конвенциите за структуриране на приложение Dart помага да се дефинират и разделят проблемите на обектите и по този начин подготвя пътя за оптимална архитектура на приложението.
За да се постигне това, основното разбиране на пакетите, библиотеките и механизма за импортиране е от решаващо значение.
Dart е проектиран с мисъл за поддържане на модулността и в Dart това се постига чрез пакети, библиотеки и класове.
В тази статия ще разделим разликата между библиотеки и пакети, както и ще обясним как да ги импортирате.
Библиотека:
В програмирането библиотеката е колекция от предварително компилирани процедури, които програмата може да използва. Рутините, понякога наричани модули.
— webopedia.com
⇒ всяко приложение на Dart е библиотека, дори когато не използва директорията lib
.
Библиотеките в Dart не са изключение, когато структурирате кода си, може да попаднете на набор от програмни инструкции (функции, константи, класове ...), които споделят същия интерес.
Библиотеката е възможност за мислене, когато структурирате код, съответно предоставяйки API.
Q: Библиотеки, трябва ли да ги използвам?
A: Да! всъщност библиотеките са важна концепция в обектно-ориентираното програмиране, защото помагат да се сведе до минимум тясното свързване и да се създаде поддържаем код.
Пример: dart:math
library е модул, който съдържа математически константи и функции, плюс генератор на произволни числа.
Създаване на собствени библиотеки
- Декларирайте библиотеката
За да декларирате библиотека в 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. Тази библиотека се импортира автоматично.
персонализирани библиотеки
персонализираните библиотеки се предлагат с два варианта
- външни библиотеки: библиотеки, които са импортирани от външни пакети.
- локални библиотеки: библиотеки, които са дефинирани в пакета на входната точка
Пакет
Пакет в Dart е всяка директория, съдържаща pubspec.yaml
файл
pubspec.yaml
Pubspec е файл с име pubspec.yaml
, който трябва да се намира в директорията на пакета на най-високо ниво.
Pubspec.yaml съдържа метаданни за нашия пакет като name
, version number
, description
и други зависимости на пакети, които нашето приложение използва.
Най-простият pubspec.yaml
file е файл, който изброява името на пакета
⇒ Всяко приложение в dart е пакет, защото трябва да има pubspec.yaml
файл
В Dart има два вида пакети.
- пакет с приложения
- библиотечен пакет
⇒ Във файла 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
в някоя от директориите, споменати по-горе.
Бележки:
- за разлика от библиотечните пакети, пакетът с приложения се нуждае от
main
файл, за да бъде изпълнен, така че добавихмеmain.dart
файл вbin
директория. Алтернативно, файлътmain.dart
може да бъде сред другите в папкаexample
или в папкаlib
. - Пропуснахме публичните файлове в директорията
lib
, тъй като този пакет е пакет с приложения.
Как работи импортирането
Зависимост
Зависимостта е друг пакет, от който вашият пакет се нуждае, за да работи
Има 2 вида зависимости:
- незабавна зависимост:
„„Зависимост“, която вашият пакет използва директно. Зависимостите, които изброявате във вашата pubspec, са непосредствените зависимости на вашия пакет.“ - преходна зависимост:
„Зависимост, която вашият пакет косвено използва, защото една от неговите зависимости го изисква. Ако вашият пакет зависи от 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. структуриране на конвенционални пакети