X36OBP - Semestrální práce

Zadání

Jednoduchá knihovna pro zpracování tabulkových dat

Cílem práce je navrhnout a implementovat jednoduchou knihovnu pro čtení, manipulaci a zápis tabulkových dat (ve smyslu aplikací typu tabulkový kalkulátor).

Datový model by měl podporovat různé typy buněk (číslo, řetězec, vzorec) a poskytovat jednoduché API pro manipulaci. Knihovna by měla postytovat API pro psaní importních a exportních modulů pro různé formáty (formát CSV bude použit jako demonstrace takovéhoto modulu).

Tým

  • Martin Plicka - plickm1<pečenáč>fel<tečka>cvut<tečka>cz
  • Pavel Andrejs - andrep1<pečenáč>fel<tečka>cvut<tečka>cz
  • Jan Skalický - skalij2<pečenáč>fel<tečka>cvut<tečka>cz
  • Filip Šimek - simekf1<pečenáč>fel<tečka>cvut<tečka>cz

Výchozí image

ČVUT SmallTalk/X 5.2.8 dostupný z http://cellstore.felk.cvut.cz/wiki/DownloadSmalltalkX

Potřebné balíčky

Není potřeba instalovat žádné další balíčky

Postup instalace

Proveďte FileIn dodaných souborů do vašeho image. Jelikož nejsou vyexportované soubory řazeny v pořadí, v jakém musí být importovány, provádějte FileIn tak dlouho, než dojde k bezproblémovému importu. Importované třídy naleznete v kategorii obp-SpreadSheet. Všechny změny se importují jako projekt SpreadSheet::all.

Ukázkový kód

sheet := SpreadSheet new.
 
"simply append rows"
sheet appendRow: #(1 2 3 4).
sheet appendRow: #(1 2 3).
 
"build expression = 3 + (2 * A1)"
"current table
 1 2 3 4
 1 2 3 nil
"
 
"expression tree"
branch := ExprBinTimes with: 2 with: (CellReference newAtRow: 1 column: 1 atSheet: sheet).
 
"CellExpression object must be on the top of the tree"
expr := CellExpression with: (ExprBinPlus with: 3 with: branch).
 
"put it into table"
sheet cellAtRow: 3 column: 1 put: expr.
 
Transcript show: ((sheet cellAtRow: 3 column: 1)value); cr.
 
"create reference range"
ref:= CellReferenceRange newFromR: 1 C: 1 toR:2 C:4 atSheet: sheet.
 
"place into function"
func:= ExprFunSum with: ref.
 
"put it into table"
sheet cellAtRow: 3 column: 2 put: (CellExpression with: func).
 
"show it"
Transcript show: ((sheet cellAtRow: 3 column:2) value);cr.
 
"now we can insert row between 1st and 2nd row, all references and ranges must be reindexed"
sheet insertRow: #(1 2 3 4 5 6) at: 2.
 
"cell with function was moved down"
Transcript show: ((sheet cellAtRow: 4 column:2) value);cr.
 
"any cell export for future export modules"
Transcript show:((sheet cellAtRow: 4 column:2) asString); cr.
 
"iterating rows or cells"
sheet rowsDo:[:x| x do: [:y| Transcript show: (y value). Transcript show: ' '.]. Transcript cr.].
 
"export it"
exporter:= SpreadSheetExporterCSV newWithFile: 'testfile'.
exporter export: sheet.
 
"import it"
importer:=SpreadSheetImporterCSV newWithFile: 'testfile'.
sheet2:= importer import.
 
"show it"
sheet2 rowsDo:[:x| Transcript show: x; cr.].
 
"delete the file"
'testfile' asFilename delete.

Seznam tříd

s popisem odpovědností

TřídaPopis
AbstractTable Abstraktní třída vnitřní implementace tabulky. Poskytuje interface definující potřebné metody.
ArrayedTable Implementace vnitřní struktury tabulky pomocí dynamických polí.
ArrayedTableRow Představuje jeden řádek vnitřní struktury tabulky ArrayedTable.
ArrayedTableTests TestCase
CellEmpty Prázdná buňka (pro účely exportu, hodnotu exportér určí podle potřeby).
CellExpression Buňka obsahující výraz. Výraz je strom složený z objektů typu Expr*. Může obsahovat konstanty, reference na buňky, operátory a funkce.
CellReference Objekt představující referenci na nějakou buňku uvnitř některého sheetu.
CellReferenceRange Představuje referenci na rozsah buněk uvnitř nějakého sheetu. Umožňuje iterovat přes všechny odkazované buňky nebo přes řádky výběru.
CellReferenceTests TestCase
CellUndefined Objekt pro nedefinovanou hodnotu (např. při chybě výpočtu).
ExprFunction Předek pro třídy funkcí.
ExprFunSum Funkce suma. Je-li argumentem CellReferenceRange, pak sečte hodnoty všech odkazovaných buněk. Jinak posílá argumentu zprávu sum.
ExprOperator Předek pro třídy operátorů.
ExprBinOperator Obecný binární operátor, rozšiřuje ExprOperator o levý a pravý operand.
ExprUnOperator Obecný unární operátor, rozšiřuje ExprOperator o jeden operand.
ExprBinMinus
ExprBinOver
ExprBinPlus
ExprBinTimes
Binární operátory: - / + *. S čísly provádějí obvyklé aritmetické operace, pro jiné datové typy operandů mohou mít jiné chování.
ExprUnNegation Unární operátor -
ExpressionTests TestCase
OperatorTests TestCase
RecursiveDefinitionError Nová chyba oznamující rekurzivní výpočet kvůli špatné definici odkazů na buňky.
SpreadSheet Třída zahrnující celou tabulku. Obsahuje jednak jednu z implementací tabulky, tak nástroje pro oznamování reindexace adres pro objekty CellReference. Objekt představující reprezentaci dat je možno vyměnit za jiného potomka třídy AbstractTable.
SpreadSheetExporter Abstraktní třída poskytující inteface pro implementaci exportních funkcí.
SpreadSheetExporterCSV Exporter jednoho Sheetu do CSV.
SpreadSheetExporterCSVTests TestCase
SpreadSheetImporter Abstraktní třída s interface pro importní moduly.
SpreadSheetImporterCSV Importer z CSV.
SpreadSheetImporterCSVTests TestCase
SpreadSheetTests TestCase
Object
Collection
Number
Integer
String
Date
Time
Modifikace základních tříd poskytují metody pro export, a vzájemné převody při operacích ve vzorcích tabulky.

Použité návrhové vzory

a třídy, které je implementují

Návrhový vzorSeznam implementujících tříd
Bridge SpreadSheet + AbstractTable a potomci - různá implementace vnitřní struktury tabulky.
Composite CellExpression + ExprOperator a potomci - konstrukce vzorců.
Decorator SpreadSheet + AbstractTable a potomci - SpreadSheet poskytuje komplexnější akce s tabulkou jako konkrétní volání zobecněných metod vnitřní implementace.
Double dispatch Binární operátory - levý operand dostane požadavek na operaci, přepošle ho pravému a zároveň specifikuje svůj typ.
Iterator CellReferenceRange, SpreadSheet, AbstractTable a potomci.
Observer SpreadSheet + CellReference, CellReferenceRange (jako observer) - Oznámení o změně indexů buněk

Test-Cases

Test-CaseSeznam testovaných tříd
ArrayedTableTests AbstractTable - některé zděděné metody
ArrayedTable
ArrayedTableRow
CellReferenceTests CellReference + test detekce rekurzivni definice
CellReferenceRange
SpreadSheet - test observeru
ExpressionTests Expr*, CellExpression - výpočet hodnot ze stromů výrazů, test sumy z CellReferenceRange
OperatorTests metody přidané k typům Date, Integer, Number, Time, String při různých kombinacích operandů
SpreadSheetExporterCSVTests SpreadSheetExporterCSV
SpreadSheetImporterCSVTests SpreadSheetImporterCSV
SpreadSheetTests SpreadSheet

Poznámky

Hlavní třída SpreadSheet, ačkoli tomu název moc nenapovídá, představuje pouze jednu tabulku. Pro sestavení sešitu ala Calc nebo Excel stačí vkládat do kolekcí. Reference fungují bez problémů mezi více objekty SpreadSheet.

obp/zprava.txt · Last modified: 2011/08/16 22:33 (external edit)
Back to top
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0