Oren Eini

aka Ayende Rahien

Oren Eini

CEO of RavenDB

a NoSQL Open Source Document Database

Get in touch with me:

oren@ravendb.net +972 52-548-6969

Posts: 7,582
|
Comments: 51,212

Copyright ©️ Ayende Rahien 2004 — 2025

Privacy Policy · Terms
filter by tags archive
stack view grid view
  • architecture (611) rss
  • bugs (450) rss
  • challanges (123) rss
  • community (379) rss
  • databases (481) rss
  • design (895) rss
  • development (641) rss
  • hibernating-practices (71) rss
  • miscellaneous (592) rss
  • performance (397) rss
  • programming (1085) rss
  • raven (1448) rss
  • ravendb.net (532) rss
  • reviews (184) rss
  • 2025
    • June (4)
    • May (10)
    • April (10)
    • March (10)
    • February (7)
    • January (12)
  • 2024
    • December (3)
    • November (2)
    • October (1)
    • September (3)
    • August (5)
    • July (10)
    • June (4)
    • May (6)
    • April (2)
    • March (8)
    • February (2)
    • January (14)
  • 2023
    • December (4)
    • October (4)
    • September (6)
    • August (12)
    • July (5)
    • June (15)
    • May (3)
    • April (11)
    • March (5)
    • February (5)
    • January (8)
  • 2022
    • December (5)
    • November (7)
    • October (7)
    • September (9)
    • August (10)
    • July (15)
    • June (12)
    • May (9)
    • April (14)
    • March (15)
    • February (13)
    • January (16)
  • 2021
    • December (23)
    • November (20)
    • October (16)
    • September (6)
    • August (16)
    • July (11)
    • June (16)
    • May (4)
    • April (10)
    • March (11)
    • February (15)
    • January (14)
  • 2020
    • December (10)
    • November (13)
    • October (15)
    • September (6)
    • August (9)
    • July (9)
    • June (17)
    • May (15)
    • April (14)
    • March (21)
    • February (16)
    • January (13)
  • 2019
    • December (17)
    • November (14)
    • October (16)
    • September (10)
    • August (8)
    • July (16)
    • June (11)
    • May (13)
    • April (18)
    • March (12)
    • February (19)
    • January (23)
  • 2018
    • December (15)
    • November (14)
    • October (19)
    • September (18)
    • August (23)
    • July (20)
    • June (20)
    • May (23)
    • April (15)
    • March (23)
    • February (19)
    • January (23)
  • 2017
    • December (21)
    • November (24)
    • October (22)
    • September (21)
    • August (23)
    • July (21)
    • June (24)
    • May (21)
    • April (21)
    • March (23)
    • February (20)
    • January (23)
  • 2016
    • December (17)
    • November (18)
    • October (22)
    • September (18)
    • August (23)
    • July (22)
    • June (17)
    • May (24)
    • April (16)
    • March (16)
    • February (21)
    • January (21)
  • 2015
    • December (5)
    • November (10)
    • October (9)
    • September (17)
    • August (20)
    • July (17)
    • June (4)
    • May (12)
    • April (9)
    • March (8)
    • February (25)
    • January (17)
  • 2014
    • December (22)
    • November (19)
    • October (21)
    • September (37)
    • August (24)
    • July (23)
    • June (13)
    • May (19)
    • April (24)
    • March (23)
    • February (21)
    • January (24)
  • 2013
    • December (23)
    • November (29)
    • October (27)
    • September (26)
    • August (24)
    • July (24)
    • June (23)
    • May (25)
    • April (26)
    • March (24)
    • February (24)
    • January (21)
  • 2012
    • December (19)
    • November (22)
    • October (27)
    • September (24)
    • August (30)
    • July (23)
    • June (25)
    • May (23)
    • April (25)
    • March (25)
    • February (28)
    • January (24)
  • 2011
    • December (17)
    • November (14)
    • October (24)
    • September (28)
    • August (27)
    • July (30)
    • June (19)
    • May (16)
    • April (30)
    • March (23)
    • February (11)
    • January (26)
  • 2010
    • December (29)
    • November (28)
    • October (35)
    • September (33)
    • August (44)
    • July (17)
    • June (20)
    • May (53)
    • April (29)
    • March (35)
    • February (33)
    • January (36)
  • 2009
    • December (37)
    • November (35)
    • October (53)
    • September (60)
    • August (66)
    • July (29)
    • June (24)
    • May (52)
    • April (63)
    • March (35)
    • February (53)
    • January (50)
  • 2008
    • December (58)
    • November (65)
    • October (46)
    • September (48)
    • August (96)
    • July (87)
    • June (45)
    • May (51)
    • April (52)
    • March (70)
    • February (43)
    • January (49)
  • 2007
    • December (100)
    • November (52)
    • October (109)
    • September (68)
    • August (80)
    • July (56)
    • June (150)
    • May (115)
    • April (73)
    • March (124)
    • February (102)
    • January (68)
  • 2006
    • December (95)
    • November (53)
    • October (120)
    • September (57)
    • August (88)
    • July (54)
    • June (103)
    • May (89)
    • April (84)
    • March (143)
    • February (78)
    • January (64)
  • 2005
    • December (70)
    • November (97)
    • October (91)
    • September (61)
    • August (74)
    • July (92)
    • June (100)
    • May (53)
    • April (42)
    • March (41)
    • February (84)
    • January (31)
  • 2004
    • December (49)
    • November (26)
    • October (26)
    • September (6)
    • April (10)
Couchbase vs RavenDB Performance at Rakuten Kobo Whitepaper
  previous post next post  
May 22 2010

Find the design flaw

time to read 1 min | 39 words

This method has a design flaw, can you see it?

image

Hint, it is using the yield keyword.

Tweet Share Share 16 comments
Tags:
  • Design

  previous post next post  

Comments

ashic
22 May 2010
07:34 AM
ashic

It's returning an IEnumerable using yield. The caller would take out the ones they need. There's no sense in passing parameters like limit as it would the the callers' responsibility to get only the number they need. IEnumerable won't trigger data access until and unless the data is required and so the limit parameter doesn't have any use.

James Newton-King
22 May 2010
07:44 AM
James Newton-King

An endId and limit seem at odds with one another.

Ayende Rahien
22 May 2010
08:40 AM
Ayende Rahien

Ashic,

Yep!

Ayende Rahien
22 May 2010
08:41 AM
Ayende Rahien

James,

startId: 1

endId: 100000

limit: 100

Chojrak
22 May 2010
08:55 AM
Chojrak

I'd change it to IEnumerable <dictionary<int,jsondocument>

, I think key-value dependencies are better handled using Dictionary. Any ideas?

Chojrak
22 May 2010
08:56 AM
Chojrak

Oh no, damned HTML. Again:

I'd change it to IEnumerable<Dictionary<int,JsonDocument>> I think key-value dependencies are better handled using Dictionary. Any ideas?

Ayende Rahien
22 May 2010
08:58 AM
Ayende Rahien

Chojrak,

It isn't key value. It is a tuple, it isn't a set of int to json doc, it is a int & json doc.

Patrik
22 May 2010
09:38 AM
Patrik

This might be personal preference but I really don't like methods exposing tuple types. Create a type (possibly a struct) that has carries some semantics instead of the tuple.

Note that this in C#, this would obviously not be my thoughts if the language was F#, Haskell, Erlang or any other functional language.

James Newton-King
22 May 2010
09:42 AM
James Newton-King

Is the collection between the startId and endId not continuous? A limit would make sense then.

Ayende Rahien
22 May 2010
09:54 AM
Ayende Rahien

James,

Yes, the collection may not be continuous

Ayende Rahien
22 May 2010
09:54 AM
Ayende Rahien

Patrik,

This is mostly for internal API needs, it just doesn't make sense to create a type here, it wouldn't add enough meaning

Andrew
22 May 2010
09:56 AM
Andrew

Is it not also bad practice to publicly expose IEnumerable for methods like this ?

Ayende Rahien
22 May 2010
10:03 AM
Ayende Rahien

Andrew,

I disagree with that quite strongly

Andrew
22 May 2010
10:19 AM
Andrew

Yeah now that I've thought it through, I'm unsure why I even said that. I read something like this on someone's blog recently and haven't had time to process it.

Dmitriy Nagirnyak
23 May 2010
23:56 PM
Dmitriy Nagirnyak

When using 'yield' the resulting items will be returned 'lazily' (delayed execution).

This might not be what the method is intended to do. I think the intention is to have the results ready after the call.

It also might have potential issue when the underlying data store is closed and the enumeration gets executed.

Cheers,

Dmitriy,

Martin R-L
17 Jun 2010
06:27 AM
Martin R-L

@Patrik,

What I do in order to use the ease of tuples and other complex generic types, and get readable code, is to at least give them a friendly name by utilizing the using statement of C#.

An example is given on my blog: http://goo.gl/ksCm

In a specific context, you can also give the type friendly method names (like e.g. Ruby's alias methods) by using extension methods that are just simple pass-throughs.

Comment preview

Comments have been closed on this topic.

Markdown formatting

ESC to close

Markdown turns plain text formatting into fancy HTML formatting.

Phrase Emphasis

*italic*   **bold**
_italic_   __bold__

Links

Inline:

An [example](http://url.com/ "Title")

Reference-style labels (titles are optional):

An [example][id]. Then, anywhere
else in the doc, define the link:
  [id]: http://example.com/  "Title"

Images

Inline (titles are optional):

![alt text](/path/img.jpg "Title")

Reference-style:

![alt text][id]
[id]: /url/to/img.jpg "Title"

Headers

Setext-style:

Header 1
========
Header 2
--------

atx-style (closing #'s are optional):

# Header 1 #
## Header 2 ##
###### Header 6

Lists

Ordered, without paragraphs:

1.  Foo
2.  Bar

Unordered, with paragraphs:

*   A list item.
    With multiple paragraphs.
*   Bar

You can nest them:

*   Abacus
    * answer
*   Bubbles
    1.  bunk
    2.  bupkis
        * BELITTLER
    3. burper
*   Cunning

Blockquotes

> Email-style angle brackets
> are used for blockquotes.
> > And, they can be nested.
> #### Headers in blockquotes
> 
> * You can quote a list.
> * Etc.

Horizontal Rules

Three or more dashes or asterisks:

---
* * *
- - - - 

Manual Line Breaks

End a line with two or more spaces:

Roses are red,   
Violets are blue.

Fenced Code Blocks

Code blocks delimited by 3 or more backticks or tildas:

```
This is a preformatted
code block
```

Header IDs

Set the id of headings with {#<id>} at end of heading line:

## My Heading {#myheading}

Tables

Fruit    |Color
---------|----------
Apples   |Red
Pears	 |Green
Bananas  |Yellow

Definition Lists

Term 1
: Definition 1
Term 2
: Definition 2

Footnotes

Body text with a footnote [^1]
[^1]: Footnote text here

Abbreviations

MDD <- will have title
*[MDD]: MarkdownDeep

 

FUTURE POSTS

  1. fsync()-ing a directory on Linux (and not Windows) - about one day from now

There are posts all the way to Jun 09, 2025

RECENT SERIES

  1. Webinar (7):
    05 Jun 2025 - Think inside the database
  2. Recording (16):
    29 May 2025 - RavenDB's Upcoming Optimizations Deep Dive
  3. RavenDB News (2):
    02 May 2025 - May 2025
  4. Production Postmortem (52):
    07 Apr 2025 - The race condition in the interlock
  5. RavenDB (13):
    02 Apr 2025 - .NET Aspire integration
View all series

RECENT COMMENTS

  • Can confirm :) still had the old developer license on my other PC, using the Force update now can me a green Your license has...
    By Steve on RavenDB GenAI Deep Dive
  • Steve, Please try that again, I believe that we sorted this out on our end.
    By Oren Eini on RavenDB GenAI Deep Dive
  • Should have kept a screenshot, tried that first but got a response in orange that said something like "it succeeded but the k...
    By Steve on RavenDB GenAI Deep Dive
  • Steve, You should have access to that feature, even with an older license. Please go to About > Force Update in the licen...
    By Oren Eini on RavenDB GenAI Deep Dive
  • For other people like me, my developer license was created before these features were available so I think since it didn't ex...
    By Steve on RavenDB GenAI Deep Dive

Syndication

Main feed Feed Stats
Comments feed   Comments Feed Stats
}