Wzorzec projektowy Pamiątka (Memento) to jeden z behawioralnych wzorców projektowych. Pozwala zapisywać i przywracać stan obiektu bez naruszania jego hermetyzacji. W artykule tłumaczę, jak działa Memento i kiedy warto go stosować. Całość ilustruję praktycznym przykładem w TypeScripcie.
Zachęcam do lektury https://devszczepaniak.pl/wzorzec-projektowy-pamiatka/
Jednocześnie ten wpis zamyka moją serię wpisów o wzorcach projektowych. Jeśli ktoś nie miał jeszcze okazji do sprawdzenia pozostałych, to zapraszam serdecznie :)
Wzorzec Pamiątka (Memento) ułatwia zarządzanie stanem obiektów. W artykule poznasz jego strukturę, zastosowania i praktyczną implementację.
https://devszczepaniak.pl/wzorzec-projektowy-pamiatka/Od jakiegoś czasu staram się już nie podniecać kolejnym modelem LLM, nową wersją modelu lub kolejnym IDE wspieranym przez AI - chyba przyszła kolej na irytację. Tokeny z płatnych planów są wypalane na kompletnie idiotyczne podpowiedzi. Napisanie każdego znaku w IDE zamienia się na ekran, który jest podobny do robienia git diff-a przy konfliktach.
Ale czy zrezygnuję? Oczywiście, że nie. Pamiętam jak za dawnych czasów mój kierownik śmiał się, że ja to umiem praogramować, jedną kombinacją klawiszy potrafię zakomentowac wszystko co zrobiłem. No to teraz idziemy dalej, jednym klawiszem wrzucamy do czarnej dziury dziesiątki linii kodu, z każdym klawiszem nowa wariacja. Tworzymy i niszczymy kolejne światy. Pojedyncze linie, funkcje, pliki albo i całe projekty. Zastanawiacie się jak będzie wyglądała metodologia wytwarzania software-u za rok? za 5 lat?
@Darth Bane: to nie pytanie retoryczne, cały czas zastanawiam się gdzie będzie rola programisty. Aktualnie jeszcze weryfikuję wszystko co mi wygeneruje AI ale ostatecznie jest to nieefektywne, zbyt wolne - AI generuje w 30 sek a potem ja przeglądam to przez 5-15 minut. Człowiek jest tutaj słabym ogniwem, zatem błędy AI będą musiały być w przyszłości korygowane w inny sposób
Odnośnie metodologii to zastanawiam się czy to nie będą powstawały zespoły wysokowyspecjalizowanych AI odpowiedzialnych, za różne aspekty. Coś w rodzaju zespołów ludzkich z rolami AI Koordynator, Architekt, DevOps, Frontend, Backend, QA, Cybersecurity.... ale ich współpraca będzie znacznie efektywniejsza, wzajemna weryfikacja nie tylko realzacji celu (feature completed) ale też drogi (quality, price...)
... i w tym modelu developer już nie będzie developerem. Może być zlecającym zadania i ostaecznie weryfikującym ich wykonanie. Zatem taki gość od DB i CRUD-ów nie będzie miał za wiele do zrobienia i nic z jego aktualnych kompetencji nie przyda się w procesie wytwarzania softu
Cześć wszystkim!
Dziś wprowadziłem nowe funkcje do obsługi wejścia i wyjścia w Avocado, które zapewniają większą elastyczność w wypisywaniu i odczytywaniu danych. Oto szczegóły zmian:
🖨 Nowe funkcje wypisywania
Podzieliłem funkcję Pisz() na trzy osobne funkcje, aby lepiej kontrolować sposób wyświetlania danych:
Pisz() – wypisuje dane na wyjście w konsoli bez dodawania nowej linii.
Przykład: Pisz('Hello World')
(Wypisze Hello World bez przechodzenia do nowej linii)
Pisznl() – wypisuje dane na wyjście w konsoli i automatycznie dodaje nową linię. Można podać wiele wartości.
Przykład: Pisznl('Wartość a: ', a, ', wartość b: ', b)
Wypisze Wartość a: <wartość>, wartość b: <wartość> i przejdzie do nowej linii)
Piszf() – umożliwia formatowanie wyjścia przy pomocy specyfikatorów formatu.
Przykład: Piszf('Imię: %s, Wiek: %d lat, Wzrost: %.2f', [Imie, Wiek, Wzrost])
(Wypisze np. Imię: Jan, Wiek: 25 lat, Wzrost: 1.75)
Nowe funkcje wczytywania danych
Czytaj('prompt') – pozwala użytkownikowi wprowadzić dane (do pierwszego białego znaku, np. spacji, tabulacji, enter).
Przykład: Czytaj('Wpisz imię')
Użytkownik wpisuje imię i program przechodzi dalej)
Czytajnl() – wczytuje całą linię tekstu, aż do znaku nowej linii. Można odczytywać wiele wartości jednocześnie.
Przykład: Czytajnl(a, b, c)
(Odczyta trzy wartości i przypisze je do zmiennych a, b, c)
Specyfikatory formatu dla Piszf()
Teraz możesz dokładnie kontrolować format wypisywanych danych dzięki specyfikatorom:
• %d – liczba całkowita
Piszf('Wiek: %d lat', [wiek])
Przykładowy wynik: Wiek: 30 lat)
• %f – liczba zmiennoprzecinkowa
Piszf('Wzrost: %f', [wzrost])
(Przykładowy wynik: Wzrost: 1.750000)
• %.2f – liczba zmiennoprzecinkowa z dwoma miejscami po przecinku
Piszf('Wzrost: %.2f', [wzrost])
(Przykładowy wynik: Wzrost: 1.75)
• %s – ciąg znaków (Tekst)
Piszf('Imię: %s', [Imie])
Przykładowy wynik: Imię: Anna)
Dzięki tym zmianom wypisywanie i wczytywanie danych w Avocado stało się bardziej intuicyjne i elastyczne!
Gdzie pobrać?
Najnowszą wersję Avocado znajdziesz tutaj:
https://avocado.dimitalart.pl/
Jeśli chcesz śledzić rozwój Avocado i dostawać najnowsze informacje, dołącz do mojego kanału na Telegramie:
https://t.me/avocado_language
Daj mi znać, co myślisz o nowej wersji! Każda opinia i sugestia są dla mnie cenne – razem możemy ulepszyć Avocado.
Dzięki, że jesteś ze mną!
#avocado
Wprowadziłem do swojego edytora kompresję danych. Zarówno dla danych projektu (pozycje voxeli i kolory ścian), jak i dla generowanego z nich mesha.
Voxele się mnożą w sporym tempie (obiekt 10x10x10
= 1000 voxeli
), więc rozmiar obiektów dość konkretnie zapychałby repozytorium.
Dane voxeli są na tyle powtarzalne, że dobrze się kompresują.
Obiekty na których operuje mój edytor dziedziczą po ScriptableObject
. Każdy obiekt to osobny plik, podobnie jak Prefab
.
Unity automatycznie serializuje dane, które wprowadzam do pól tych obiektów.
Żeby zmodyfikować format serializowanych danych, należy skorzystać z ISerializationCallbackReceiver.
Serializujemy inne dane niż te, na których operujemy, czyli np. ich skompresowaną formę.
Copilot mi wygenerował odpowiedni kod, który zastosowałem do list:
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using UnityEngine;
[System.Serializable]
public class CompressedVector3List : ISerializationCallbackReceiver
{
[SerializeField] private byte[] compressedData; // Składujemy skompresowane dane jako tablicę bajtów
private List<Vector3> originalData = new List<Vector3>();
public List<Vector3> OriginalData
{
get { return originalData; }
set { originalData = value; }
}
// Wywoływane przed serializacją
public void OnBeforeSerialize()
{
// Serializujemy dane jako listę floatów
List<float> floatData = new List<float>();
foreach (var vec in originalData)
{
floatData.Add(vec.x);
floatData.Add(vec.y);
floatData.Add(vec.z);
}
// Konwertujemy listę floatów na bajty
byte[] uncompressedData;
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(ms))
{
foreach (var value in floatData)
{
writer.Write(value);
}
}
uncompressedData = ms.ToArray();
}
// Kompresujemy dane bajtowe przy użyciu GZipStream
using (MemoryStream compressedStream = new MemoryStream())
{
using (GZipStream gzip = new GZipStream(compressedStream, CompressionMode.Compress))
{
gzip.Write(uncompressedData, 0, uncompressedData.Length);
}
compressedData = compressedStream.ToArray();
}
}
// Wywoływane po deserializacji
public void OnAfterDeserialize()
{
// Dekompresujemy dane bajtowe
byte[] decompressedData;
using (MemoryStream compressedStream = new MemoryStream(compressedData))
{
using (MemoryStream decompressedStream = new MemoryStream())
{
using (GZipStream gzip = new GZipStream(compressedStream, CompressionMode.Decompress))
{
gzip.CopyTo(decompressedStream);
}
decompressedData = decompressedStream.ToArray();
}
}
// Konwertujemy bajty na listę floatów
List<float> floatData = new List<float>();
using (MemoryStream ms = new MemoryStream(decompressedData))
{
using (BinaryReader reader = new BinaryReader(ms))
{
while (ms.Position < ms.Length)
{
floatData.Add(reader.ReadSingle());
}
}
}
// Odtwarzamy listę Vector3 z listy floatów
originalData = new List<Vector3>();
for (int i = 0; i < floatData.Count; i += 3)
{
originalData.Add(new Vector3(floatData[i], floatData[i + 1], floatData[i + 2]));
}
}
}
Dopisałem do tej klasy kod, żeby jej instancje zachowywały się jak lista, czyli odpowiednie pola, metody, operator []
...
Oraz zrobiłem dodatkowe warianty tej klasy dla list z danymi innego typu.
W ScriptableObjectach wystarczyło potem tylko zmienić typy pól:
Dodatkowo zmieniłem, żeby ScriptableObject
był zapisywany w formacie binarnym, zamiast w tekstowym:
[PreferBinarySerialization]
public class VoxelMeshBaked : ScriptableObject
Voxelowy mesh, który wcześniej zajmował 150kB, teraz zajmuje 9kB ;)
Cześć wszystkim,
Dziś dodałem nową funkcję w języku Avocado – możliwość dodawania własnych modułów napisanych w Pascalu. Dzięki temu możesz rozszerzać możliwości Avocado i korzystać z dodatkowych funkcji według własnych potrzeb.
Jak działają moduły?
• Moduły wczytują się z folderu "moduly", który znajduje się obok plików IDE Avocado.
• Aby zaimportować moduł, użyj komendy:
Importuj nazwa_modułu
Nowy moduł: Matematyka
Dodałem moduł "matematyka", który zawiera 24 funkcje matematyczne i trygonometryczne, w tym:
• Podstawowe funkcje trygonometryczne:
sin(), cos(), tan(), arcsin(), arccos(), arctan(), arctan2()
• Konwersje stopni i radianów:
degtorad(), radtodeg()
• Liczba π:
pi
• Funkcje hiperboliczne:
sinh(), cosh(), tanh(), sech(), csch(), coth(), arsinh(), arcosh(), artanh()
• Dodatkowe funkcje matematyczne:
sec(), csc(), cot(), arcsec(), arccot()
Jak korzystać z modułu "matematyka"?
Aby używać funkcji matematycznych, wystarczy:
1. Zaimportować moduł
2. Użyć funkcji oblicz('wyrażenie'), wpisując wyrażenie w cudzysłowie
Przykłady użycia
Podstawowe operacje matematyczne:
Program math
Importuj matematyka
oblicz('(10+40+34)*2')
// Wynik: 168.00
oblicz('2.3+3.0+40')
// Wynik: 45.30
Funkcje trygonometryczne:
oblicz('cos(0)')
// Wynik: 1.00
oblicz('cos(pi/2)')
// Wynik: 0.00
oblicz('2 * sin(pi/6)')
// Wynik: 1.00
Funkcje hiperboliczne:
oblicz('cosh(0)')
// Wynik: 1.00
oblicz('sinh(1)')
// Wynik: 1.18
Funkcje odwrotne:
oblicz('arcsin(0.5) * 180/pi')
// Wynik: 30.00
oblicz('arccos(0.5) * 180/pi')
// Wynik: 60.00
oblicz('arccot(1)')
// Wynik: 0.79
oblicz('arcsec(2)')
// Wynik: 1.05
oblicz('arccsc(2)')
// Wynik: 0.52
Dzięki tej nowej funkcji Avocado staje się jeszcze bardziej elastyczne i daje większe możliwości rozbudowy. Możesz teraz pisać własne moduły w Pascalu i dodawać je do Avocado według swoich potrzeb.
Gdzie pobrać?
Najnowszą wersję Avocado znajdziesz tutaj:
https://avocado.dimitalart.pl/
Bądź na bieżąco!
Jeśli chcesz śledzić rozwój Avocado i dostawać najnowsze informacje, dołącz do mojego kanału na Telegramie:
https://t.me/avocado_language
Jak zawsze, czekam na Wasze opinie i sugestie!
Cześć wszystkim,
Mam przyjemność ogłosić najnowszą aktualizację języka Avocado, która wprowadza szereg nowych funkcji oraz usprawnień. Poniżej znajdziecie szczegółowy opis najważniejszych zmian, które pojawiły się w tej wersji.
36 typów konwersji
W tej aktualizacji dodałem aż 36 nowych typów konwersji, które znacząco rozszerzają możliwości języka Avocado. Dzięki nim operacje na różnych typach danych stają się jeszcze bardziej intuicyjne i wydajne.
Nowy wygląd interfejsu
Całkowicie przeprojektowałem interfejs użytkownika. Nowy wygląd interfejsu zapewnia bardziej przejrzysty układ oraz lepszą ergonomię pracy. Wprowadzono między innymi:
• Podświetlenie składni, które ułatwia czytanie i edycję kodu.
• Podpowiadanie kodu – wystarczy nacisnąć kombinację klawiszy CTRL + Spacja, aby wyświetlić okno z propozycjami kodu, co znacząco przyspiesza pisanie programów.
Instalator dla Windows
Dla użytkowników systemu Windows przygotowałem dedykowany instalator, który ułatwi instalację i konfigurację środowiska Avocado.
Aktualizowana dokumentacja
Dokumentacja języka została zaktualizowana i jest dostępna na oficjalnej stronie. Znajdziecie tam pełen zestaw informacji, przykłady oraz wskazówki dotyczące korzystania z nowych funkcji.
Obecnie Avocado ma zaimplementowane 97 funkcji, co czyni go wszechstronnym narzędziem do tworzenia oprogramowania. Nową funkcjonalnością jest także możliwość importu modułów z Free Pascala. Wystarczy użyć komendy:
Importuj nazwa_modułu
aby włączyć moduły i rozszerzyć możliwości swojego projektu.
Aktualizacja została udostępniona dnia 26 marca 2025.
Zapraszam do zapoznania się z nowościami oraz do korzystania z ulepszonego środowiska Avocado.
Gdzie pobrać?
Najnowszą wersję Avocado znajdziesz tutaj:
https://avocado.dimitalart.pl/
Bądź na bieżąco!
Jeśli chcesz śledzić rozwój Avocado i dostawać najnowsze informacje, dołącz do mojego kanału na Telegramie:
https://t.me/avocado_language
Dajcie znać, co sądzicie o tej wersji. Każda opinia i sugestia są dla mnie bardzo cenne – razem możemy tworzyć jeszcze lepsze narzędzie dla programistów.
Dziękuję, że jesteście ze mną.
#avocado
Wideo
Jeśli to nie pytanie retoryczne, to spekuluję że za kilka lat programowanie to będzie bardziej dostrajanie. Dostrajanie do potrzeb biznesowych tego co wypluje AI. Może jakaś rywalizacja modeli jeden będzie pisał kod a drugi razem z programistą będzie tworzył przypadki testowe i wszystko będzie śmigać w kontenerach. Powstaną nowe języki programowania w których będą programować modele AI.