Tanulófeladatok


A tanulófeladatok olyan feladatok, amelyek célja, hogy meghatározott (programozási) fogalmakat tanítsanak. A tanulófeladatok által tanított fogalmak egy tantervet alkotnak. Ha többet szeretnél megtudni arról, hogyan tervezz tantervet, nézd meg a tanterv dokumentációt.

Note

Egy új tanulófeladatot gyorsan létrehozhatsz, ha a következő parancsokat futtatod a kurzus gyökérkönyvtárából:

bin/fetch-configlet
bin/configlet create --concept-exercise <slug>

További információért nézd meg a configlet create dokumentációt

Metaadatok

A tanulófeladatok metaadatai az exercises.concept kulcsban vannak meghatározva a config.json fájlban. A metaadatok meghatározzák a feladat UUID-jét, slugját és egyebeket.

Példa

{
  "exercises": {
    "concept": [
      {
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "concepts": ["if-statements", "numbers"],
        "prerequisites": ["basics"]
      }
    ]
  }
}

Fájlok

Minden tanulófeladatnak saját könyvtára van a kurzus exercises/concept könyvtárán belül. A tanulófeladat könyvtárának nevének meg kell egyeznie a tanulófeladat slug tulajdonságával, ahogyan az a config.json fájlban meg van határozva.

A tanulófeladatban négyféle fájl található:

Dokumentációs fájlok

Ezeket a fájlokat megmutatjuk a tanulónak, hogy segítsenek elmagyarázni a feladatot.

  • .docs/introduction.md: bemutatja a feladat által a tanulónak tanított fogalmat/fogalmakat (kötelező)
  • .docs/instructions.md: útmutatást ad a feladathoz (kötelező)
  • .docs/hints.md: tippeket ad a tanulónak, hogy segítsen neki, ha elakad egy feladatban (kötelező)

Metaadatfájlok

Ezeket a fájlokat nem mutatjuk meg a tanulónak, hanem a feladat metaadatainak meghatározására szolgálnak.

  • .meta/config.json: a feladatra vonatkozó metaadatokat tartalmaz (kötelező)
  • .meta/design.md: leírja a feladat kialakítását (kötelező)

Megközelítésfájlok

Ezek a fájlok a feladathoz tartozó megközelítéseket írják le.

  • .approaches/introduction.md: bevezetés a feladat leggyakoribb megközelítéseibe (opcionális)
  • .approaches/config.json: a megközelítések metaadatai (opcionális)
  • .approaches/<approach-slug>/content.md: a megközelítés leírása (opcionális)
  • .approaches/<approach-slug>/snippet.txt: a megközelítést bemutató részlet (opcionális)

Cikkfájlok

Ezek a fájlok a feladathoz tartozó cikkeket írják le.

  • .articles/config.json: a cikkek metaadatai (opcionális)
  • .articles/<article-slug>/content.md: a cikk leírása (opcionális)
  • .articles/<article-slug>/snippet.md: a cikket bemutató részlet (opcionális)

Feladatfájlok

A nyelvspecifikus fájlok, mint például a megvalósítás és a tesztek fájljai. Ezeknek a fájloknak a neve kurzusspecifikus.

  • Tesztkészlet: ellenőrzi a megoldás helyességét (kötelező)
  • Stub megvalósítás: kiindulópontot ad a tanulóknak (kötelező)
  • Exemplar megvalósítás: egy idiomatikus megvalósítást ad, amely minden teszten átmegy (kötelező)
  • További fájlok: biztosítják, hogy a tesztek lefuthassanak (opcionális)

Példa

exercises
└── concept
    └── cars-assemble
        ├── .approaches
        |   ├── for-loop
        |   |   ├── content.md
        |   |   └── snippet.txt
        |   ├── config.json
        |   └── introduction.md
        ├── .articles
        |   ├── performance
        |   |   ├── content.md
        |   |   └── snippet.md
        |   └── config.json
        ├── .docs
        |   ├── introduction.md
        |   ├── instructions.md
        |   └── hints.md
        ├── .meta
        |   ├── config.json        
        |   ├── design.md
        |   └── Exemplar.cs (exemplar megvalósítás)
        ├── CarsAssemble.cs (stub megvalósítás)
        └── CarsAssemblyTests.cs (tesztek)

Minimális érvényes specifikáció

Az új feladatoknál az „optimista összevonás” megközelítést részesítjük előnyben, ahol a kurzusok „fejlesztés alatt” állapotban dolgozhatják ki a feladatokat. A minimális érvényes állapot, amely átmegy a configleten, és lehetővé teszi az összevonást:

  • Érvényes bejegyzés a kurzus config.json fájljában, a status wip-re állítva.
  • Egy érvényes .meta/config.json fájl
  • A következő fájlok megléte, bár üresek lehetnek:
    • .docs/introduction.md
    • .docs/instructions.md
    • .docs/hints.md
    • Stub megvalósítás
    • Tesztfájl

Fájl: .docs/introduction.md

Cél: A feladat által a tanulónak tanított fogalom/fogalmak bemutatása.

Meglét: kötelező

  • A megadott információnak éppen annyi kontextust kell adnia a tanulónak, hogy maga is kitalálhassa a megoldást.
  • Csak azt az információt add meg, amely a fogalom alapjainak megértéséhez és a feladat megoldásához szükséges. A többletinformációt a fogalom about.md dokumentumában hagyd.
  • A hivatkozásokat takarékosan használd, ha egyáltalán. Bár egy olyan összetett témát magyarázó hivatkozás, mint a rekurzió, hasznos lehet, a legtöbb fogalom esetében a hivatkozások a szükségesnél több információt adnak, ezért inkább arra törekedj, hogy a dolgokat tömören, a szövegben magyarázd el.
  • Használd a megfelelő szaknyelvi kifejezéseket, hogy a tanuló könnyen kereshessen további információt.
  • Kódpéldákat csak új szintaxis bemutatására használj (a tanulóknak nem kell a weben szintaxis példákat keresniük). Más esetekben kód helyett inkább leírásokat vagy hivatkozásokat adj.

Például egy „stringekkel” foglalkozó feladat bevezetése leírhatja a stringet pusztán „Unicode-karakterek sorozataként” vagy „bájtok sorozataként”, elmagyarázhatja a felhasználóknak, hogyan hozhatnak létre stringet, és kifejtheti, hogy a stringnek vannak metódusai, amelyekkel módosítható. Hacsak a tanulónak nem kell részletesebb összefüggéseket megértenie a feladat megoldásához, az ilyen rövid magyarázat (a szintaxisára vonatkozó példával együtt) elegendő információt nyújt a tanulónak a feladat megoldásához.

Példa

# Introduction

There are two primary ways to assign objects to names in Ruby - using variables or constants. Variables are always written in snake case. A variable can reference different objects over its lifetime. For example, `my_first_variable` can be defined and redefined many times using the `=` operator:

```ruby
my_first_variable = 1
my_first_variable = "Some string"
my_first_variable = SomeComplexObject.new
```

Fájl: .docs/introduction.md.tpl

Cél: Sablon, amelyből egy introduction.md fájl generálható.

Meglét: opcionális

Az introduction.md dokumentum bemutatja a feladat fogalma(it) a tanulónak. Minden fogalomnak megvan a maga introduction.md dokumentuma is, amelyet a feladat kontextusán kívül nem mutatunk meg.

Ha a fogalom bevezetését szó szerint bele kell foglalni a feladat bevezetésébe, használható egy introduction.md.tpl fájl. Ez a fájl lehetővé teszi a fogalmak bevezetéseire való hivatkozást helyőrzőkön keresztül: %{concept:<concept-slug>}.

A configlet képes egy introduction.md fájlt létrehozni egy sablonfájlból. A létrehozott fájlban a fogalom helyőrzőit a fogalom introduction tartalma helyettesíti.

Az Exercism weboldala csak az introduction.md dokumentumról tud. A kurzus felelőssége, hogy létrehozza az introduction.md fájlt, amikor sablonfájlt használ.

A kurzusok feladatonként eldönthetik, hogy használnak-e sablont. Bizonyos esetekben nem biztos, hogy optimális a fogalom bevezetését szó szerint beilleszteni. Mindig azt válaszd, ami a legjobb tanulási élményt nyújtja a tanulónak.

Példa

# Introduction

%{concept:variables}

Fájl: .docs/instructions.md

Cél: Útmutatást adni a feladathoz.

Meglét: kötelező

Ez a fájl két részre oszlik.

  1. Az első rész elmagyarázza a feladat „történetét” vagy „témáját”. Általában nem tartalmazhat kódpéldákat.
  2. A második rész világos útmutatást ad arról, hogy mit kell a tanulónak tennie, egy vagy több részfeladat formájában.

Minden részfeladatnak meg kell felelnie a következő szabványnak:

  • Második szintű címsorral kezdődik, amely egy számmal kezdődik (pl. ## 1. Do X, ## 2. Do Y).
  • A címsornak azt kell leírnia, mit kell megvalósítani, nem pedig azt, hogyan (pl. ## 1. Check if an appointment has already passed).
  • Írja le, melyik függvényt/metódust kell a tanulónak definiálnia/megvalósítania (pl. Implement method X(...) that takes an A and returns a Z),
  • Adjon példát a függvény kódban való használatára. Ezeknek a példáknak különbözniük kell a tesztekben szereplőktől.

Nagy hangsúlyt fektetünk arra, hogy az Exercism tartalma mindenki számára biztonságos legyen, ezért a történetek megfelelőségének eldöntésénél gyakran inkább az óvatosabb utat választjuk. Bár odafigyelünk arra, mit vonunk össze, tisztában vagyunk vele, hogy nehéz észrevenni, mi tűnhet problémásnak, ezért mindig feltételezzük, hogy jóhiszeműen jársz el, és igyekszünk a felülvizsgálat során minden problémát konfrontálódás nélkül elkapni. Ha szeretnél egy történetet ellenőrizni velünk, említsd meg az @exercism/leadership csapatot, és együtt megnézzük. Íme néhány iránymutató pont:

  • Igyekezz biztosítani, hogy a történet befogadó legyen, és mindenki megértse. Ha a történet belsős poénokat vagy regionális szlenget tartalmaz, gondolkodj alternatív megfogalmazásokon.
  • Igyekezz olyan példákat írni, amelyek mindenkit befogadnak. Gondolj például arra, hogy más kultúrákból származó neveket és vegyes nemeket használj.
  • Kérdezd meg magadtól, ismersz-e személyesen valakit, akit megsérthetne a történet. Ha igen, fontold meg, hogy megváltoztatod, hogy elkerüld ezt.

Példa

# Instructions

In this exercise you're going to write some code to help you cook a brilliant lasagna from your favorite cooking book.

## 1. Calculate the remaining oven time in minutes

Define the `Lasagna#remaining_minutes_in_oven` method that takes the actual minutes the lasagna has been in the oven as a parameter and returns how many minutes the lasagna still has to remain in the oven, based on the expected oven time in minutes from the previous task.

```ruby
lasagna = Lasagna.new
lasagna.remaining_minutes_in_oven(30)
# => 10
```

Fájl: .docs/hints.md

Cél: Tippeket adni a tanulónak, hogy segítsen neki, ha elakad egy feladatban.

Meglét: kötelező

  • Ha a tanuló elakad, lehetővé tesszük, hogy egy gombra kattintva tippet kérjen, amely megmutatja a fájl vonatkozó részét.
  • A tippeket címsorok alatt felsorolásként kell megadni.
  • A tippeknek elegendőnek kell lenniük ahhoz, hogy szinte bármelyik tanulót kisegítsék.
  • A tippek ne mondják ki nyíltan a megoldást, hanem mutassanak egy olyan forrásra, amely leírja azt (pl. hivatkozás a használandó függvény dokumentációjára).
  • A tippek használhatnak kódpéldákat a fogalmak magyarázatához, de nem a megoldás felvázolásához. Pl. egy listákkal foglalkozó feladatban mutathatnak egy részletet arról, hogyan működik egy bizonyos listafüggvény, de nem olyan formában, hogy az közvetlenül beilleszthető legyen a megoldásba.
  • A feladatra vonatkozó általános tippek Markdown-listaként jelenhetnek meg a ## General címsor alatt.
  • A részfeladatra vonatkozó tippek Markdown-listaként jelenjenek meg olyan címsorok alatt, amelyek megegyeznek a hozzájuk tartozó részfeladat címsorával az instructions.md fájlban (pl. ## 2. Do Y).
  • Ha nincsenek általános tippek, vagy nincsenek tippek egy adott részfeladathoz, a címsorokat el kell hagyni. Minden címsort Markdown-listának kell követnie.
  • A részfeladatra vonatkozó tippeket előnyben részesítsd az általános tippekkel szemben, mert a részfeladatra vonatkozó tippek nagyobb valószínűséggel segítik ki a tanulót, mint az általánosak.
  • A részfeladat címsorai azt írják le, mit kell tenni, nem pedig azt, hogyan.
  • A részfeladat címsoraiban a szokásos mondatkezdő nagybetűzés érvényesüljön (pl. ## 2. Check if a book can be borrowed).
  • A részfeladatok egyértelműen határozzák meg, melyik metódust/függvényt/típust kell megvalósítani, és mi a várt értéke (pl. Implement the 'canBorrowBook' function to check if a book can be borrowed. The function takes a book as its parameter and returns `true` if the book has not already been borrowed; otherwise, return `false`).

A tippek megtekintése nem „ajánlott” útvonal lesz, és (finoman) lebeszélünk róla, hacsak a tanuló nem tud nélküle továbbhaladni. Ezért érdemes figyelembe venni, hogy az azt olvasó tanuló kicsit zavart/elveszett és talán frusztrált lesz.

Példa

# Hints

## General

- You need to define a [constant][constant] which should contain the [integer][integers] value specified in the recipe.

## 1. Calculate the remaining oven time in minutes

- You need to define a [method][methods] with a single parameter for the actual time so far.

[constants]: https://www.rubyguides.com/2017/07/ruby-constants/
[integers]: https://ruby-doc.org/core-2.7.0/Integer.html
[methods]: https://launchschool.com/books/ruby/read/methods

Fájl: .meta/design.md

Cél: A feladat kialakításának leírása.

Meglét: kötelező

Ez a fájl a feladat kialakítására vonatkozó információkat tartalmaz, beleértve a célját, a tanítási céljait, azt, hogy mit nem szabad tanítani, és egyebeket. Ezek az információk kinyerhetők a feladathoz tartozó GitHub-issue-ból.

Azért létezik, hogy tájékoztassa a jövőbeli karbantartókat vagy közreműködőket a feladat scope-járól és korlátairól, elkerülve azt a természetes tendenciát, hogy a feladatok idővel egyre összetettebbekké válnak.

Példa

# Design

## Goal

The goal of this exercise is to teach the student the basics of programming in Ruby.

## Learning objectives

- Know what a variable is.
- Know how to define a variable.
- Know how to update a variable.

## Out of scope

- Memory and performance characteristics.
- Method overloads.

## Concepts

The Concepts this exercise unlocks are:

- `basics`: know what a variable is; know how to define a variable; know how to update a variable.

## Prerequisites

There are no prerequisites.

Fájl: .meta/config.json

Cél: A feladatra vonatkozó metaadatokat tartalmaz.

Meglét: kötelező

Ez a fájl a feladatra vonatkozó metaadatokat tartalmazza:

  • authors: A feladat szerzőjének/szerzőinek GitHub-felhasználóneve(i) (kötelező)
    • A felülvizsgálókat is beleértve, ha a felülvizsgálatuk jelentősen megváltoztatja a feladatot (olyannyira, hogy úgy tűnik, „együtt jutottatok el idáig”)
  • contributors: A feladat közreműködőjének/közreműködőinek GitHub-felhasználóneve(i) (opcionális)
    • A felülvizsgálókat is beleértve, ha a felülvizsgálatuk hasznos/végrehajtható/végrehajtott.
  • forked_from: Melyik feladat(ok)ból forkolták (kötelező, ha a feladat forkolt)
  • files: A feladatban használt fájlok helye, a feladat könyvtárához viszonyítva (kötelező)
  • language_versions: Nyelvi verziókövetelmények (opcionális)
  • blurb: A feladat rövid leírása. A hossza legfeljebb 350 lehet. A Markdown nem támogatott (kötelező)
  • source: A forrás, amelyen a feladat alapul (opcionális)
  • source_url: A forrás URL-je, amelyen a feladat alapul (opcionális)
  • representer: Azzal kapcsolatos metaadatok, hogy a representer hogyan dolgozza fel ezt a fájlt (opcionális)
    • version: Egész szám, amely a feladathoz használandó representer verzióját adja meg (kötelező, ha a szülőkulcs jelen van)
  • icon: Az ikon slugja (lásd az ikonok teljes listáját). Ha nincs megadva, a feladat slugja lesz használva (opcionális)
  • custom: Bármilyen feladatspecifikus, nem szabványos adat. A kurzus toolingjának feladatonkénti viselkedésének testreszabására használható (opcionális)

Ha valaki egyszerre szerző és közreműködő, csak szerzőként sorold fel.

Minimális példa

{
  "authors": ["FSharpForever"],
  "files": {
    "solution": ["Lasagna.fs"],
    "test": ["LasagnaTests.fs"],
    "exemplar": [".meta/Exemplar.fs"]
  },
  "blurb": "Learn the basics of F# by cooking Lucian's Luscious Lasagna"
}

Teljes példa

Tegyük fel, hogy a FSharpForever felhasználó írt egy log-levels nevű feladatot az F# kurzushoz. A PythonProfessor átalakítja a feladatot a Python kurzushoz. Később a GladToHelp felhasználó továbbfejleszti a feladatot.

{
  "authors": ["PythonProfessor"],
  "contributors": ["GladToHelp"],
  "files": {
    "solution": ["log_levels.py"],
    "test": ["log_levels_test.py"],
    "exemplar": [".meta/exemplar.py"],
    "editor": ["test_helper.py"]
  },
  "forked_from": ["fsharp/log-levels"],
  "language_versions": ">=3.7",
  "blurb": "Learn how to work with strings by processing log lines.",
  "source": "Wikipedia",
  "source_url": "https://en.wikipedia.org/wiki/Log_file",
  "representer": {
    "version": 2
  },
  "icon": "logs",
  "custom": {
    "parallel": true
  }
}

Vedd figyelembe, hogy:

  • A szerzők és közreműködők sorrendje nem számít, és nincs jelentése.
  • Ha egy feladatot forkolsz, ne hivatkozz az eredeti szerzőkre vagy közreműködőkre. Csak arról gondoskodj, hogy a forked_from helyes legyen.
  • Bár nem gyakori, lehetséges több feladatból forkolni.
  • A language_versions egy szabad formátumú string, amelyet a kurzusok tetszés szerint használhatnak és értelmezhetnek.

Fájl: .approaches/introduction.md

Cél: Bevezetés a feladat leggyakoribb megközelítéseibe

Meglét: opcionális

Ez a fájl a feladat leggyakoribb megközelítéseit írja le. Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.

Példa

# Introduction

The key to this exercise is to deal with C# strings being immutable, which means that a `string`'s value cannot be changed.
Therefore, to reverse a string you'll need to create a _new_ `string`.

## Using LINQ

```csharp
public static string Reverse(string input)
{
    return new string(input.Reverse().ToArray());
}
```

For more information, check the [LINQ approach][approach-linq].

## Which approach to use?

If readability is your primary concern (and it usually should be), the LINQ-based approach is hard to beat.

Fájl: .approaches/config.json

Cél: A megközelítések metaadatai

Meglét: opcionális (kötelező, ha létezik megközelítés-bevezetés vagy megközelítés)

Ez a fájl a feladat megközelítéseire vonatkozó metaadatokat tartalmazza:

  • introduction: A feladat megközelítés-bevezetésének szerzőjének/szerzőinek GitHub-felhasználóneve(i) (opcionális)

    • authors: A feladat megközelítés-bevezetésének szerzőjének/szerzőinek GitHub-felhasználóneve(i) (kötelező)
      • A felülvizsgálókat is beleértve, ha a felülvizsgálatuk jelentősen megváltoztatja a megközelítés-bevezetést (olyannyira, hogy úgy tűnik, „együtt jutottatok el idáig”)
    • contributors: A feladat megközelítés-bevezetésének közreműködőjének/közreműködőinek GitHub-felhasználóneve(i) (opcionális)
      • A felülvizsgálókat is beleértve, ha a felülvizsgálatuk hasznos/végrehajtható/végrehajtott.
  • approaches: A részletes megközelítéseket felsoroló tömb (opcionális)

    • uuid: egy V4 UUID, amely egyedileg azonosítja a megközelítést. A UUID-nak egyedinek kell lennie a kurzusan belül és az összes kurzuson át is, és soha nem változhat
    • slug: a megközelítés slugja, amely kisbetűs, kebab-case formátumú string. A slugnak egyedinek kell lennie a kurzushoz tartozó összes megközelítés-slug közül. A hossza legfeljebb 255 lehet.
    • title: a megközelítés címe. A hossza legfeljebb 255 lehet.
    • blurb: A megközelítés rövid leírása. A hossza legfeljebb 350 lehet. A Markdown nem támogatott (kötelező)
    • authors: A feladat megközelítésének szerzőjének/szerzőinek GitHub-felhasználóneve(i) (kötelező)
      • A felülvizsgálókat is beleértve, ha a felülvizsgálatuk jelentősen megváltoztatja a megközelítést (olyannyira, hogy úgy tűnik, „együtt jutottatok el idáig”)
    • contributors: A feladat megközelítésének közreműködőjének/közreműködőinek GitHub-felhasználóneve(i) (opcionális)
      • A felülvizsgálókat is beleértve, ha a felülvizsgálatuk hasznos/végrehajtható/végrehajtott.
    • tags: Meghatározza, milyen feltételek mellett kapcsolódik egy beküldés egy megközelítéshez. (opcionális)
      • all: Olyan tagek tömbje, amelyeknek mind jelen kell lenniük egy beküldésnél (opcionális, kivéve, ha az any-nek nincsenek elemei)
      • any: Olyan tagek tömbje, amelyek közül legalább egynek jelen kell lennie egy beküldésnél (opcionális, kivéve, ha az all-nak nincsenek elemei)
      • not: egyik tag sem lehet jelen egy beküldésnél (opcionális)

Példa

{
  "introduction": {
    "authors": ["erikschierboom"]
  },
  "approaches": [
    {
      "uuid": "448fb2b4-18ab-4e55-aa54-ad4ed6d5f7f6",
      "slug": "span",
      "title": "Use Span<T>",
      "blurb": "Use Span<T> to efficiently reverse a string.",
      "authors": ["erikschierboom"]
    }
  ]
}

Fájl: .approaches/<approach-slug>/content.md

Cél: A megközelítés részletes leírása

Meglét: opcionális (a megközelítéseknél kötelező)

Ez a fájl a megközelítés részletes leírását tartalmazza. Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.

Példa

# Span

```csharp
Span<char> chars = stackalloc char[input.Length];
for (var i = 0; i < input.Length; i++)
{
    chars[input.Length - 1 - i] = input[i];
}
return new string(chars);
```

This `Span<T>` approach uses a `for` loop.

Fájl: .approaches/<approach-slug>/snippet.txt

Cél: A megközelítést bemutató részlet

Meglét: opcionális (a megközelítéseknél kötelező)

Ez a fájl egy kis részletet tartalmaz, amely bemutatja a megközelítést. A részlet a feladat Áss mélyebbre oldalán jelenik meg.

A sorainak száma legfeljebb 8 lehet.

Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.

Példa

Span<char> chars = stackalloc char[input.Length];
for (var i = 0; i < input.Length; i++)
{
    chars[input.Length - 1 - i] = input[i];
}
return new string(chars);

Fájl: .article/config.json

Cél: A cikkek metaadatai

Meglét: opcionális (kötelező, ha létezik cikk)

Ez a fájl a feladat cikkeire vonatkozó metaadatokat tartalmazza:

  • articles: A részletes cikkeket felsoroló tömb (opcionális)
    • uuid: egy V4 UUID, amely egyedileg azonosítja a cikket. A UUID-nak egyedinek kell lennie a kurzusan belül és az összes kurzuson át is, és soha nem változhat
    • slug: a cikk slugja, amely kisbetűs, kebab-case formátumú string. A slugnak egyedinek kell lennie a kurzushoz tartozó összes cikk-slug közül. A hossza legfeljebb 255 lehet.
    • title: a cikk címe. A hossza legfeljebb 255 lehet.
    • blurb: A cikk rövid leírása. A hossza legfeljebb 350 lehet. A Markdown nem támogatott (kötelező)
    • authors: A feladat cikkének szerzőjének/szerzőinek GitHub-felhasználóneve(i) (kötelező)
      • A felülvizsgálókat is beleértve, ha a felülvizsgálatuk jelentősen megváltoztatja a cikket (olyannyira, hogy úgy tűnik, „együtt jutottatok el idáig”)
    • contributors: A feladat cikkének közreműködőjének/közreműködőinek GitHub-felhasználóneve(i) (opcionális)
      • A felülvizsgálókat is beleértve, ha a felülvizsgálatuk hasznos/végrehajtható/végrehajtott.

Példa

{
  "articles": [
    {
      "uuid": "6db71962-62d5-448b-a980-c20ae41013ed",
      "slug": "performance",
      "title": "Optimizing performance",
      "blurb": "Explore how to most efficiently reverse a string and what the trade-offs are.",
      "authors": ["erikschierboom"]
    }
  ]
}

Fájl: .articles/<article-slug>/content.md

Cél: A megközelítés részletes leírása

Meglét: opcionális (a megközelítéseknél kötelező)

Ez a fájl a megközelítés részletes leírását tartalmazza. Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.

Példa

# Performance

In this document, we'll find out which approach is the most performant one.

## Benchmark results

| Method |      Mean |     Error |    StdDev |    Median | Allocated |
| -----: | --------: | --------: | --------: | --------: | --------: |
|   Linq | 29.133 ns | 0.5865 ns | 0.5486 ns | 28.984 ns |      80 B |
|  Array |  4.806 ns | 0.4999 ns | 1.4739 ns |  3.967 ns |         - |

Fájl: .articles/<article-slug>/snippet.txt

Cél: A megközelítést bemutató részlet

Meglét: opcionális (a cikkeknél kötelező)

Ez a fájl egy kis részletet tartalmaz, amely bemutatja a cikket. A részlet a feladat Áss mélyebbre oldalán jelenik meg.

A sorainak száma legfeljebb 8 lehet.

Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.

Példa

| Method |      Mean | Allocated |
| -----: | --------: | --------: |
|   Linq | 29.133 ns |      80 B |
|  Array |  4.806 ns |         - |

Fájl: Stub megvalósítás

Cél: Kiindulópontot adni a tanulóknak.

Meglét: kötelező

  • Úgy tervezd meg a stubot, hogy a tanuló tudja, hova írjon kódot.
  • Definiálj stubokat minden olyan szintaxishez, amelyet a feladat nem vezet be. A legtöbb feladatnál ez a stub függvények/metódusok definiálását jelenti.
  • Fordított nyelveknél gondolj arra, hogy a kód lefordítható legyen, mivel a fordító üzenetei néha nehezen érthetők a nyelvben újonc tanulóknak.
  • A kód legyen a lehető legegyszerűbb.
  • Csak a feladat vagy előfeltételei (és azok előfeltételei, és így tovább) által bevezetett nyelvi elemeket használd.
  • A stub fájlt megmutatjuk a tanulónak, amikor böngészőben kódol, és letöltődik a tanuló fájlrendszerére, amikor a CLI-t használja.
  • A stub megvalósítás fájljaihoz vezető relatív útvonalakat a .meta/config.json fájl "files.solution" kulcsában kell megadni.

Példa

class Lasagna
  def remaining_minutes_in_oven(actual_minutes_in_oven)
    raise NotImplementedError, 'Please implement the Lasagna#remaining_minutes_in_oven method'
  end

  def preparation_time_in_minutes(layers)
    raise NotImplementedError, 'Please implement the Lasagna#preparation_time_in_minutes method'
  end
end

Fájl: Tesztek

Cél: A megoldás helyességének ellenőrzése.

Meglét: kötelező

  • A tesztek ne használják az instructions.md fájl példáit.
  • A kód legyen a lehető legegyszerűbb.
  • Csak a feladat előfeltételei (és azok előfeltételei, és így tovább) által bevezetett nyelvi elemeket használd.
  • A tesztek fájlját nem mutatjuk meg a tanulónak, amikor böngészőben kódol, de letöltődik a tanuló fájlrendszerére, amikor a CLI-t használja.
  • A tesztek fájljaihoz vezető relatív útvonalakat a .meta/config.json fájl "files.test" kulcsában kell megadni.

Példa

require 'minitest/autorun'
require_relative 'lasagna'

class LasagnaTest < Minitest::Test
  def test_remaining_minutes_in_oven
    assert_equal 15, Lasagna.new.remaining_minutes_in_oven(25)
  end

  def test_preparation_time_in_minutes_with_one_layer
    assert_equal 2, Lasagna.new.preparation_time_in_minutes(1)
  end

  def test_preparation_time_in_minutes_with_multiple_layers
    assert_equal 8, Lasagna.new.preparation_time_in_minutes(4)
  end
end

Fájl: Exemplar megvalósítás

Cél: Biztosítani azt a célmegvalósítást, amelyre a tanulónak törekednie kell.

Meglét: kötelező

  • Ez a megvalósítás az a célkód, amelyre a tanulónak törekednie kell.
  • A mentorok ezt a kódot látják „célként”, amikor visszajelzést írnak
  • A megvalósítás csak a feladat vagy előfeltételei (és azok előfeltételei, és így tovább) által bevezetett nyelvi elemeket használja.
  • Az exemplar fájlt nem mutatjuk meg a tanulónak, amikor böngészőben kódol, és nem töltődik le a tanuló fájlrendszerére, amikor a CLI-t használja.
  • Az exemplar fájlt a mentorok látják, amikor megoldásokra vagy reprezentációkra írnak megjegyzést.
  • A példa-megvalósítás fájljaihoz vezető relatív útvonalakat a .meta/config.json fájl "files.exemplar" kulcsában kell megadni.

Példa

class Lasagna
  EXPECTED_MINUTES_IN_OVEN = 40
  PREPARATION_MINUTES_PER_LAYER = 2

  def remaining_minutes_in_oven(actual_minutes_in_oven)
    EXPECTED_MINUTES_IN_OVEN - actual_minutes_in_oven
  end

  def preparation_time_in_minutes(layers)
    layers * PREPARATION_MINUTES_PER_LAYER
  end
end

Fájl: További fájlok

Cél: Biztosítani, hogy a tesztek lefuthassanak.

Meglét: kötelező, ha az alapértelmezett fájlok nem elegendőek a tesztek futtatásához

Egyes nyelveknél további fájlokra van szükség a tesztek futtatásához. Ilyenek például a C# projektfájljai és a Node package.json fájljai, amelyek nélkül nem lehet futtatni a teszteket.

Megosztott fájlok

Egyes fájlok nem egyedi feladatokhoz tartoznak, hanem minden feladatra érvényesek. További információért nézd meg a dokumentációt.

Elnevezés

A tanulófeladatokat a történetük/témájuk alapján kell elnevezni, nem a fogalmaik alapján.

Jó példák nevekre:

  • Tim from Marketing
  • Lucian's Luscious Lasagna
  • Calculator Conundrum

Nem megengedett nevek:

  • Booleans: fogalomnevet használ, nem történetnevet
  • Exercise #1: egy feladat nem történet/téma

Amikor egy feladatot jelentős változtatások nélkül forkolsz, lehetőség szerint az eredeti nevet használd.

Slugok

Minden feladatnak van egy slugja is, amely a feladat nevének normalizált változata a következő szabályok szerint:

  1. Használj kisbetűket.
  2. Használj kebab-case formátumot.
  3. Használj latin betűket, számjegyeket és kötőjeleket (reguláris kifejezés: [a-z0-9-]+)
  4. A kiírt számjegyeket részesítsd előnyben a számmal írtakkal szemben, kivéve, ha konkrét okod van a számjegy előnyben részesítésére (pl. two-fer a 2-fer helyett)

Jó példák slugokra:

  • tim-from-marketing
  • lucians-luscious-lasagna
  • calculator-conundrum

Nem megengedett slugok:

  • TIM-FROM-MARKETING: nem használ kisbetűket (vagyis tim-from-marketing)
  • TimFromMarketing: nem kebab-case formátumú (vagyis tim-from-marketing)
  • floating-point-numbers: fogalomnevet használ, nem történetnevet

Megjelenítés

Különbség van abban, hogyan jelenítjük meg a feladat dokumentációját a tanulónak a böngészőbeli szerkesztő használatakor a CLI használatához képest. További információért lásd ezt a dokumentumot.

Ikon

Minden feladathoz tartozik egy kísérő ikon. Alapértelmezés szerint a megjelenített ikon az, amelynek a neve megegyezik a feladat slugjával. Ezt felül lehet bírálni az icon tulajdonság megadásával a feladat .meta/config.json fájljában.

Ha egy meglévő feladatot forkolsz, valószínűleg már van ikon ahhoz a feladathoz. Ha nincs, kérünk, nyiss egy issue-t a website-icons tárolóban.