C'est un sujet très ancien mais qui m'a sauté aux yeux à ce stade tardif et j'aimerais avoir quelques commentaires alors que j'essaie de défendre les propriétés en écriture seule ...
J'ai un ensemble de ActiveReport
classes qui font partie d'un site Web qui sont instanciées et exécutées sur postback après un certain nombre de sélections d'utilisateurs.
Le code VB ressemble à ceci:
Public Class SomeReport
Private greader As New GenericReporting.CommonReader("AStoredProcedure",
{New SqlParameter("budget_id", 0)})
Public WriteOnly Property BudgetID As Integer
Set(value As Integer)
greader.Parameters("budget_id").Value = value
End Set
End Property
Public Sub New(Optional budget_id As Integer = 0)
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
BudgetID = budget_id
End Sub
End Class
Ces rapports utilisent des tripes génériques, CommonReader
prennent une procédure stockée et un tableau de SqlParameter
s par défaut , chacun ayant une propriété WriteOnly associée qui, selon la conception du rapport, peut être transmise en tant que paramètre lors de l'instanciation ou définie par l'utilisateur après l'instanciation avant appel de la Run
méthode des rapports .
'''''''''''''''''''''''
' Parameter taken from a user selected row of a GridView
'
Dim SomeBudgetID As Integer = gvBudgets.SelectedDataKey.Values(budget_id)
'''''''''''''''''''''''
' On Instantiation
'
Dim R as ActiveReport = New SomeReport(SomeBudgetID)
R.Run()
'''''''''''''''''''''''
' Or On Instantiation using "With" syntax
'
Dim R as ActiveReport = New SomeReport() With {.BudgetID = SomeBudgetID}
R.Run()
'''''''''''''''''''''''
' Or After
'
Dim R as ActiveReport = New SomeReport()
R.BudgetID = SomeBudgetID
R.Run()
Donc, comme je le vois, avoir une propriété en écriture seule dans ce cas
- Permet une vérification de type plus forte car les
SqlParameter
s sont un peu génériques
- Plus de flexibilité dans la création du rapport, le rapport peut être instancié immédiatement si tous les paramètres sont disponibles ou ajoutés par la suite au fur et à mesure qu'ils deviennent disponibles.
- Les propriétés prennent en charge la syntaxe "With" lors de l'instanciation
- Un "getter" est-il vraiment nécessaire car les paramètres sont connus de l'utilisateur et ne sont pas modifiés par le rapport?
- Étant donné que les
SqlParameter
s sont des classes et non des valeurs primitives, les propriétés WriteOnly permettent une interface plus simple pour définir les paramètres
Voilà mes pensées.
Puis-je le convertir en méthode à la place? certes mais l'interface semble ... moins sympa
R2.BudgetID = SomeBudgetID
contre
R2.SetBudgetID(SomeBudgetID)