Как написать предварительное условие в псевдокоде
Мне было просто интересно, если бы кто-нибудь знал, как представить предварительное условие в псевдокоде, так как я осмотрелся вокруг, ничего не могу найти по этому вопросу.
Спасибо
2 ответа
Псевдокод, по определению, не формализованный код. Примером использования псевдокода для определения предварительного условия для метода C# будет:
// Precondition: Object must have been initialized by calling init() or by
// manually setting properties X and Y such that X.Foo >= Y.Bar.
public void doUsefulWork() {
...
}
Ясно, что поскольку псевдокод не формализован, он не может быть проверен компилятором.
- Пользователь метода должен убедиться, что предварительные условия выполнены, и
- разработчик метода обязан признать, что изменение предусловия (как правило) является критическим изменением.
Я вижу здесь две возможности:
Если вы можете сформулировать свои условия в реальном коде, я бы попробовал Программирование с утверждениями (или.NET-эквивалент Debug.Assert). Таким образом, вы можете проверить ваши условия во время выполнения с помощью
assert condition
Если это не так или вы просто не хотите этого, вы можете записать условие pre и post в ваш JavaDoc.
/** * @precondition: the connection has been established. * * @postcondition: the schema is created. * */
Вы даже можете определить эти аннотации JavaDoc, чтобы они появлялись в документации, сгенерированной JavaDoc. Таким образом, вы можете использовать естественный язык, вы определяете, что вы хотите утверждать.
Вы также можете выразить свои предварительные и постусловия более математически, чтобы я мог увеличить краткость ваших условий, что может сделать их более понятными:
Для простого сравнения чисел вы можете использовать <
, <=
, >
, >=
и т. д. Но допустим, что вы хотите определить инвариант для Set
тогда вы могли бы выразить это как:
/**
* @invariant: set == filterDuplicates(set)
*
*/
Таким образом, используя гипотетические / псевдо-функции, чтобы выразить ваши условия.
Это может быть развито даже дальше, если вы любите функциональные языки. Мой профессор структуры данных и алгоритмов использовал Haskell для определения предусловия, постусловия и инвариантов для вновь представленных структур данных:
module TreeSets(TreeSet,
contains, add, remove, card, traverse)
where
data Ord t => TreeSet t = E | N (TreeSet t) t (TreeSet t)
inv E = True
inv(N l x r) = all(<x)(abs l) && all(>x)(abs r) &&
inv l && inv r
Это действительно зависит от того, для кого вы пишете, поэтому я рекомендую использовать естественный язык. Это может понять каждый и особенно для объектно-ориентированных программ, которые легче всего сформулировать.