C'è un motivo comunemente usato (o raramente) per un messaggio di "conferma di voler eseguire questo" quando si chiama una funzione da una libreria?
Ho un'API che espone alcune operazioni potenzialmente pericolose se utilizzate in modo improprio (causerebbero modifiche indesiderate al database). Vorrei passare un avvertimento al chiamante per ricontrollare che questo è apposta. Questo è sia per evitare che altri programmatori dell'organizzazione utilizzino erroneamente l'API e per impedire a un utente finale di eseguire accidentalmente questo comando da un modulo senza pensarci.
Ci sono davvero tre casi d'uso per questa funzione API:
- Eseguilo contro dati legit. Dovrebbe riuscire senza avvisi.
- Eseguilo contro i cattivi dati. Dovrebbe fallire con un'eccezione.
- Eseguilo contro dati discutibili. La logica di validazione vede che si tratta di un caso non standard, ma forse l'utente finale sa cosa sta facendo e lo fa apposta.
Ho cercato di pensare a un modo per inserire case 3 nella mia API.
In un modo in cui ho pensato di ruotare attorno a un "token di conferma"
Sub DoRiskyOperation(thisData As String, Optional confirmationToken As ConfirmationToken)
If Not Validate(thisData) Then
Throw New ArgumentOutOfRangeException("thisData", $"Cannot perform this operation on {thisData}.")
End If
If Not confirmationToken.ItsOK Then
If Not TotallySafe(thisData) Then
Throw New Warning("thisData", $"Are you sure you want to do this?", _
New ConfirmationToken(AreYouSure))
End If
End If
'perform risky operation
End Sub
Un altro modo che stavo considerando è più un "chiedere prima" che a volte è disapprovato:
Enum PredictedSuccess
WillSucceed
WillFail
WillSucceedButIsRisky
End Enum
Private LastDataAskedAbout As String
Function IsOperationRisky(thisData As String) As PredictedSuccess
LastDataAskedAbout = thisData
If Not Validate(thisData) Then Return PredictedSuccess.WillFail
If TotallySafe(thisData) Then
Return PredictedSuccess.WillSucceed
Else
Return PredictedSuccess.WillSucceedButIsRisky
End If
End Function
Sub DoRiskyOperation(thisData As String)
If Not Validate(thisData) Then Throw New ArgumentOutOfRangeException("thisData", $"Cannot perform this operation on {thisData}.")
If Not TotallySafe(thisData) AndAlso LastDataAskedAbout <> thisData Then
Throw New InvalidOperationException($"Hey, you were supposed to check before you try doing something this dangerous to {thisData}!")
End If
'perform risky operation
End Sub
Esiste un altro modo per codificare il concetto di questa "stretta di mano di conferma" in un'API a cui non sto pensando?
Nel caso in cui qualcuno fosse interessato, l'uso specifico - caso sta aggiornando il costo standard mentre c'è inventario a portata di mano. I ragionieri sono schizzinosi su questo genere di cose.